我有一组看起来像这样的数据

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”将数据分开以获取:
  • 一个文件,其中包含字符串“cond1”,在“M”和“m”字母之前或之后都包含任何内容。我目前正在为此使用此命令(显然不排除M和m):
    awk 'BEGIN{IGNORECASE=1} $4 ~ /.cond1/ || $4 ~ /cond1./ ' /filepath.tab
    

    也请不要在数据的第4、9和11行中的“cond1”和其他字符串之间包含空格,我希望在文件中包含此内容。 (命令中的“。”是否包含空格?)
  • 我编写了一个命令来获取仅在“col4”中包含“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即可。

    10-07 13:19