(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))