我如何编写一个脚本,让 awk .txt 文件带有空格来读取 .csv?

我如何编写一个脚本,让 awk .txt 文件带有空格来读取 .csv?

我有一个从下表中提取的代码(testtam.txt)

gene1   1   3   5   9           
gene2   0   0   4   4           
gene3   1   0   1   2           
gene4   5   5   0   10          
gene5   2   0   0   2   

仅字段 2、3 或 4 之一的值不为 0 的行,并将它们保存到单独的文件(匹配文件)中:

awk '{
    if (    ($2 == $5 && $3 == 0 && $4 == 0) || \
        ($2 == 0 && $3 == $5 && $4 == 0) || \
        ($2 == 0 && $3 == 0 && $4 == $5) ) {
        print $0 > "match-file"
}   else if ($2 + $3 + $4 == $5) {
        print $0 > "nomatch-file"
     }    
}' testtam.txt

问题是它不适用于 .csv 文件,例如,如果我有那种.csv

gene1,1,3,5,9           
gene2,0,0,4,4           
gene3,1,0,1,2           
gene4,5,5,0,10          
gene5,2,0,0,2

awk 将其识别为一列。

如何让我的代码读取 .csv 中的列?

答案1

您只需要使用不同的字段分隔符。这就是 awk-F选项的作用:

awk -F',' '{
    if (    ($2 == $5 && $3 == 0 && $4 == 0) || \
        ($2 == 0 && $3 == $5 && $4 == 0) || \
        ($2 == 0 && $3 == 0 && $4 == $5) ) {
        print $0 > "match-file"
}   else if ($2 + $3 + $4 == $5) {
        print $0 > "nomatch-file"
     }    
}' 

或者,如果您想要匹配从第二个到最后一个字段中至少有两个字段的值不为 0 的行,您可以这样做:

awk -F, '{ 
            c=0; 
            for(i=2;i<=NF-1;i++){ 
                c+= $i!=0
            } 
            print > ((c > 1) ? 
                "match-file" : 
                "nomatch-file")
          }' file

相关内容