5つの列と複数の行を持つテーブルがあります。
最後の列には、各行のすべての値の合計が含まれています。
そう:
A B C D E
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
私が望むのは、gene2とgene5行を別々のファイルに抽出し、他の遺伝子(抽出された遺伝子ではない)、gene1、gene3、およびgene4を含む他のファイルを持つことです。
コマンドを使用しようとしていますが、awk
行と数字をリンクする方法がわかりません。
答え1
使用awk
:
awk '{
if ( ($2 == $5 && $3 + $4 == 0) || ($3 == $5 && $2 + $4 == 0) || ($4 == $5 && $2 + $3 == 0) ) {
print $0 > "match-file"
} else if ($2 + $3 + $4 == $5) {
print $0 > "nomatch-file"
}
}' input
答え2
(非常に類似)代替品:
awk '{
if ( $2 == $5 || $3 == $5|| $4 == $5 ) {
print $0 > "match-file"
} else if ($2 + $3 + $4 == $5) {
print $0 > "nomatch-file"
}
}' input
答え3
Using GNU awk:
$ awk 'NR>1{
t = gensub(/ /, " ", "g")
f = gsub(/ 0 /, "", t) > 1 ? "File1" : "File2"
print $0 > f
}' file
すべてのPosix sed構造を使用して、次のことができます。
$ sed -ne '
1b
s/[[:blank:]]0[[:blank:]]/&/2w File1
t
s/^//w File2
' file
sed をモードで実行すると、-n
モードスペースはデフォルトで印刷されません。ヘッダー行をスキップして最初の行と見なします。
ヘッダー以外の行に複数の別々のゼロが表示される場合は、=>最後の列は2、3、または4つの列のいずれかに一致する必要があります。これは、最後の列が2、3、4列の合計であるためです。
先行または末尾の空白がないとします。
一致するレコードを見つけるために、結果はFile1にダンプされます。残りはFile2です。ヘッダーは両方の出力に存在しません。
答え4
行で2つの(先行)0を探しているようです。この場合は、以下を試してください。
awk '{if (NR==1){print > "match"; print > "nomatch"}
else
{if ($0 ~ / 0.* 0/) {print > "match"} else {print > "nomatch"}}}' file1