用awk搜索多个条件字符串

Err*_*404 6 unix linux awk sed

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

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
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写几个命令来根据"col4"分离数据,以获得:

  1. 包含字符串"cond1"的文件,除了"M"和"m"字母之外或之后的ANYTHING.我目前正在使用此命令(显然不排除M和m):

    awk 'BEGIN{IGNORECASE=1} $4 ~ /.cond1/ || $4 ~ /cond1./ ' /filepath.tab
    
    Run Code Online (Sandbox Code Playgroud)

    另请注意,第4行,第9行和第11行数据包含"cond1"和其他字符串之间的空格,我希望在文件中包含此内容.(命令中的"."是否包含空格?)

  2. 我写了一个命令,只在"col4"中获取一个包含"cond1"的文件

    awk 'BEGIN{IGNORECASE=1} $4 ~ /^cond1$/ '  /filepath.tab
    
    Run Code Online (Sandbox Code Playgroud)

    它与大多数数据一起工作正常,但我在结果中得到了这两个错误:

    ABC9    DEF9    GHI9    cond1 at 50
    ABCc    DEFc    GHIc    cond1 something
    
    Run Code Online (Sandbox Code Playgroud)

有谁可以请帮我这两个命令?谢谢.

我正在寻找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
Run Code Online (Sandbox Code Playgroud)

File2(仅包含cond1):

col1    col2    col3    col4
ABC1    DEF1    GHI1    cond1
ABC6    DEF6    GHI6    cond1
Run Code Online (Sandbox Code Playgroud)

File3(包含未包含在file1和file2中的任何内容):

col1    col2    col3    col4
ABC7    DEF7    GHI7    mcond1
ABC8    DEF8    GHI8    cond2
ABCc    DEFc    GHIc    Mcond1
Run Code Online (Sandbox Code Playgroud)

请注意,3个文件的总行数与原始文件相同,如果这听起来相当复杂,我很抱歉,但实际情况就是这样.

Chr*_*our 2

问题是第 4 列中有空格,并且您的文件未按预期格式化,请尝试awk -F'\t' {print $4} file并注意它可能不是您所期望的。

首先将文件转换为 CSV 格式:sed

$ 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
Run Code Online (Sandbox Code Playgroud)

这只会将前 3 个空白组转换为逗号,将 col4 保留为您想要的。要将更改存储在文件中,请使用以下-i选项:

sed -i 's/\s\+/,/;s/\s\+/,/;s/\s\+/,/;' file
Run Code Online (Sandbox Code Playgroud)

,现在可以使用字段分隔符。

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
Run Code Online (Sandbox Code Playgroud)

只需重定向即可保存新文件awk '{...}' > file1