次のファイルがあります。
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1
chr1 3001273 3001279 2
chr1 3001625 3001631 3
chr1 3003222 3003228 4
chr1 3003335 3003341 4
chr1 3003375 3003381 4
chr1 3003578 3003584 4
chr1 3003636 3003642 4
chr1 3003717 3003723 4
chr1 3003881 3003887 4
chr1 3003894 3003900 4
chr1 3004526 3004532 5
chr1 3005994 3006000 6
chr1 3006183 3006189 6
chr1 3006412 3006418 7
chr1 3006778 3006784 8
chr1 3006877 3006883 8
chr1 3007166 3007172 9
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10
4番目の列に特定の数字を含む行を特定の回数だけ取得したいと思います。
4列に同じ数字が3倍ある行を取得したいと仮定すると、出力は次のようになります。
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10
..この行の数字1と10が4列に3回表示されるためです。
どんなアイデアでも大いに感謝します。ありがとうございます!
ベストアンサー1
解決策awk
:
awk 'FNR==NR{c[$4]++;next;} c[$4]==3' file.dat file.dat
出力:
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10
説明する:
FNR==NR
:このテストは、レコード数がファイル内のレコード数と等しい場合に真です。 2番目のファイルNR
はfile1 + FNRの行数と同じであるため、これは最初のファイルでのみ機能します。c[$4]++
:配列要素のインデックスを増やします$4
。カウンターとして使っています。next
: 他の操作を行わずに次のレコードに移動します。c[$4]==3
: これは、2 番目のファイルのレコードにのみ発生します。このテストが成功すると印刷が行われ、その行が印刷されますawk
。
このコードの欠点は、ファイルを2回読み取ることです。しかし、私の考えでは、これが仕事を行うためのきちんと理解しやすい方法です。