2つのテキストファイルがあります。名前をfile1.txtとfile2.txtとして指定します。
file1.txtは次のようになります
chr10 181144 225933
chr10 181243 225933
chr10 181500 225933
chr10 226069 255828
chr10 255989 267134
chr10 255989 282777
chr10 267297 282777
chr10 282856 283524
chr10 283618 285377
chr10 285466 285995
file2.txtは次のようになります
chr10 181144 225933
chr10 181243 225933
chr10 181500 225933
chr10 255989 282777
chr10 267297 282777
chr10 282856 283524
chr10 375542 387138
chr10 386930 387138
chr10 387270 390748
chr10 390859 390938
chr10 391051 394580
chr10 394703 395270
単一ファイルとして出力したいのは
- file1とfile2の間のすべての共通行
- 両方のファイルに共通していないfile1のすべての行
- 両方のファイルに共通ではないfile2のすべての行。
私はこれを行うためにPerlスクリプトを書いたが、コマンドラインまたはより簡単な方法があると確信しています。
答え1
両方のファイルに共通する行は次のとおりです。
comm -12 file1.txt file2.txt > results.txt
file1.txtに関連する行を追加します。
comm -23 file1.txt file2.txt >> results.txt
file2.txtに関連する行を追加します。
comm -13 file1.txt file2.txt >> results.txt
ファイルがまだソートされていない場合、たとえばシェルがプロセス置換をサポートしている場合は、事前にソートする必要があります。
comm -12 <(sort file1.txt) <(sort file2.txt)
など。
答え2
一つあるコミュニケーション操作を実行するコマンドです。ただし、他の標準ツール(例grep
:sort
これを使用するソリューションであり、使用するのと同じです)。uniq
join
grep
comm
両方のファイルに共通する行は次のとおりです。
grep -xF -f file1 file2
comm -12 <(sort -u file1) <(sort -u file2)
次の行のみfile1
:
grep -vxF -f file2 file1
comm -23 <(sort -u file1) <(sort -u file2)
次の行のみfile2
:
grep -vxF -f file1 file2
comm -13 <(sort -u file1) <(sort -u file2)