列に数字が連続して表示される回数に基づいて行を選択するには?

列に数字が連続して表示される回数に基づいて行を選択するには?

次のファイルがあります。

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回読み取ることです。しかし、私の考えでは、これが仕事を行うためのきちんと理解しやすい方法です。

おすすめ記事