端末で次のコードを実行しています。
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まさかファイル2(NR
総レコード数を参照すると、みんな入力は、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))