テーブルから行を抽出して別のファイルに入れるにはどうすればよいですか?

テーブルから行を抽出して別のファイルに入れるにはどうすればよいですか?

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

関連情報