我有一组看起来像这样的数据
col1 col2 col3 col4
ABC1 DEF1 GHI1 cond1
ABC2 DEF2 GHI2 cond1-cond2
ABC3 DEF3 GHI3 cond2/cond1
ABC4 DEF4 GHI4 cond2 cond1
ABC5 DEF5 GHI5 cond4/cond1
ABC6 DEF6 GHI6 cond1
ABC7 DEF7 GHI7 mcond1
ABC8 DEF8 GHI8 cond2
ABC9 DEF9 GHI9 cond1 at 50
ABCa DEFa GHIa con cond1
ABCb DEFb GHIb no. cond1
ABCc DEFc GHIc cond1 something
ABCc DEFc GHIc Mcond1
我正在尝试编写一些命令来根据“col4”将数据分开以获取:
awk 'BEGIN{IGNORECASE=1} $4 ~ /.cond1/ || $4 ~ /cond1./ ' /filepath.tab
也请不要在数据的第4、9和11行中的“cond1”和其他字符串之间包含空格,我希望在文件中包含此内容。 (命令中的“。”是否包含空格?)
awk 'BEGIN{IGNORECASE=1} $4 ~ /^cond1$/ ' /filepath.tab
尽管我在结果中遇到了这两个错误,但大多数数据都可以正常工作:
ABC9 DEF9 GHI9 cond1 at 50
ABCc DEFc GHIc cond1 something
任何人都可以通过这两个命令来帮助我吗?
谢谢。
我正在寻找不包含任何重复项的3个文件的输出,这是一个示例:
File1(包含与cond1的所有组合):
col1 col2 col3 col4
ABC2 DEF2 GHI2 cond1-cond2
ABC3 DEF3 GHI3 cond2/cond1
ABC4 DEF4 GHI4 cond2 cond1
ABC5 DEF5 GHI5 cond4/cond1
ABC9 DEF9 GHI9 cond1 at 50
ABCa DEFa GHIa con cond1
ABCb DEFb GHIb no. cond1
ABCc DEFc GHIc cond1 something
File2(仅包含cond1):
col1 col2 col3 col4
ABC1 DEF1 GHI1 cond1
ABC6 DEF6 GHI6 cond1
File3(包含文件1和文件2中未包含的任何内容):
col1 col2 col3 col4
ABC7 DEF7 GHI7 mcond1
ABC8 DEF8 GHI8 cond2
ABCc DEFc GHIc Mcond1
请注意,这3个文件的总行数与原始文件相同
如果这听起来很复杂,我很抱歉,但这确实是我的情况。
最佳答案
问题在于第4列中有空格,并且您的文件未按预期格式格式化,请尝试awk -F'\t' {print $4} file
并注意它可能不是您所期望的。
首先使用sed
将文件转换为CSV格式
$ sed 's/\s\+/,/;s/\s\+/,/;s/\s\+/,/;' file
col1,col2,col3,col4
ABC1,DEF1,GHI1,cond1
ABC2,DEF2,GHI2,cond1-cond2
ABC3,DEF3,GHI3,cond2/cond1
ABC4,DEF4,GHI4,cond2 cond1
ABC5,DEF5,GHI5,cond4/cond1
ABC6,DEF6,GHI6,cond1
ABC7,DEF7,GHI7,mcond1
ABC8,DEF8,GHI8,cond2
ABC9,DEF9,GHI9,cond1 at 50
ABCa,DEFa,GHIa,con cond1
ABCb,DEFb,GHIb,no. cond1
ABCc,DEFc,GHIc,cond1 something
ABCc,DEFc,GHIc,Mcond1
这只会将前3个空白组转换为逗号,并根据需要保留col4。要将更改存储在文件中,请使用
-i
选项:sed -i 's/\s\+/,/;s/\s\+/,/;s/\s\+/,/;' file
现在可以使用字段分隔符
,
。awk 'BEGIN{FS=",";OFS="\t"} NR==1{print $1,$2,$3,$4} $4~/cond1./|| $4~/[^mM]cond1/{print $1,$2,$3,$4}' file
col1 col2 col3 col4
ABC2 DEF2 GHI2 cond1-cond2
ABC3 DEF3 GHI3 cond2/cond1
ABC4 DEF4 GHI4 cond2 cond1
ABC5 DEF5 GHI5 cond4/cond1
ABC9 DEF9 GHI9 cond1 at 50
ABCa DEFa GHIa con cond1
ABCb DEFb GHIb no. cond1
ABCc DEFc GHIc cond1 something
$ awk 'BEGIN{FS=",";OFS="\t"} NR==1{print $1,$2,$3,$4} $4~/^cond1$/{print $1,$2,$3,$4}' file
col1 col2 col3 col4
ABC1 DEF1 GHI1 cond1
ABC6 DEF6 GHI6 cond1
$ awk 'BEGIN{FS=",";OFS="\t"} $4!~/cond1/ || $4~/[Mm]cond1/{print $1,$2,$3,$4}' file
col1 col2 col3 col4
ABC7 DEF7 GHI7 mcond1
ABC8 DEF8 GHI8 cond2
ABCc DEFc GHIc Mcond1
只需重定向以保存新文件
awk '{...}' > file1
即可。