以下の表(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