空白のある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のいずれかの値がゼロ以外の行のみを別々のファイル(一致ファイル)に保存します。

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"
     }    
}' 

または、2番目のフィールドから最後のフィールドまで、2つ以上のフィールド値がゼロ以外の行を一致させるには、次のようにします。

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

おすすめ記事