
端末で次のコードを実行しています。
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))
答え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 diff
GNU差分文書より多くの情報を知りたいです。