(5つの回答)
3年前に閉じられました。
ターミナルで実行する次のコードがあります。
LC_ALL=C && grep -F -f genename2.txt hg38.hgnc.bed > hg38.hgnc.goi.bed
これでは、2つのファイル間の共通線はわかりません。何が足りないのですか?
承認された回答:
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
これはfile1の全行を読んでいます seen
という配列に キーを1行全体として(awk
内) $0
現在の行全体を表します。
NR==FNR
を使用しました 最初の入力に対してのみ後続のブロックを実行する条件としてfle1 file2ではありません 、NR
awk
で 現在の処理行番号とFNR
を参照してください allの現在の行番号を参照しています 入力。したがって、NR
入力ファイルごとに一意ですが、FNR
すべての入力に対して一意です。
next
awk
に伝えていますか 残りのコードを続行せず、NR
まで再開します FNR
と等しくない つまり、 file1のすべての行を意味します awk
によって読み取られます 。
次に次のseen[$0]
2番目のfile2に対してのみ実行されます file2の各行 配列を調べて、配列内に存在する場所にその行を出力します。
もう1つの簡単なオプションは、sort
を使用することです。 およびuniq
:
sort file1 file2|uniq -d
これにより、両方のファイルが並べ替えられてからuniq -d
が出力されます。 重複した行のみを印刷します。ただし、これは、両方のファイル自体に重複する行がない場合に許可されます。それ以外の場合は、両方のファイル内に重複する行がある場合でも、以下が常に許可されます。
uniq -d <(sort <(sort -u file1) <(sort -u file2))