2つのファイル間の共通行

2つのファイル間の共通行

端末で次のコードを実行しています。

LC_ALL=C && grep -F -f  genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed

これは、2つのファイル間の共通点を提供しません。私はそこから何を逃していますか?

ベストアンサー1

comm -12 file1 file2両方のファイルの共通行を取得するために使用されます。

期待どおりに機能するには、ファイルを並べ替える必要があるかもしれませんcomm

comm -12 <(sort file1) <(sort file2)

~からman comm:

-1     suppress column 1 (lines unique to FILE1)
-2     suppress column 2 (lines unique to FILE2)

または使用grep-xコマンドを実行するには、行全体を一致パターンに一致させるオプションを追加する必要があります。このFオプションは、grep一致パターンが正規表現ではなく文字列で一致するように指示します。

grep -Fxf file1 file2

またはawk

awk 'NR==FNR{seen[$0]=1; next} seen[$0]' file1 file2

これは完全な行を読むことですファイル1seenキーが行全体の配列に変換します(inは現在の行全体をawk意味します)。$0

NR==FNR最初の入力に対してのみ、次のブロックを実行する条件として使用します。ファイル1まさかファイル2NR総レコード数を参照すると、みんな入力は、FNR個々の入力ごとのファイルレコードの数です。したがって、FNRこれは各入力ファイルに対して一意であり、NRすべての入力ファイルに対して一意です。 )

このnextステートメントは、awkコードの残りの部分を続けるのではなく、NR同じではなくなるまで再起動することを意味しますFNR。これはすべての行を意味します。ファイル1読むことができますawk

これにより、次の条件はseen[$0]2番目の入力にのみ適用されます。ファイル2。各行についてファイル2現在表示されている=1各行を印刷します。ファイル1配列から。

もう一つの簡単なオプションは、次を使用することsortですuniq

sort file1 file2|uniq -d

これにより、両方のファイルが並べ替えられ、重複した行だけがuniq -d印刷されます。ただし、これは2つのファイル自体に重複した行がない場合は許可されます。

uniq -d <(sort <(sort -u file1) <(sort -u file2))

おすすめ記事