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

答え2

Linuxで実行されているため、GNU / Linuxであり、GNUdiffコマンドを使用しているとします。

GNUコマンドを実行している場合は、次のようにdiff変更された行と共通行の両方を表示できます。

diff \
--old-line-format='-%l
' \
--new-line-format='+%l
' \
--unchanged-line-format=' %l
' \
"$@"

これは既存の出力と似ていますdiffが、出力にファイル名や区切り線が表示されず、前の行が表示され、新しい行の-前に接頭辞が付けられ+、通常の行の前にスペースが付けられます

以下は、サンプルシェルスクリプトとテストファイルの結果出力です。

$ cat diffcomm.sh
#!/bin/sh
diff \
--old-line-format='-%l
' \
--new-line-format='+%l
' \
--unchanged-line-format=' %l
' \
"$@"
$ cat > filea
a
b
c
d
$ cat > fileb
a
z
d
$ ./diffcomm.sh  filea fileb
 a
-b
-c
+z
 d
$

各行タイプの出力形式を変更できます。

を参照してman diffください。info diffGNU差分文書より多くの情報を知りたいです。

関連情報