複数のテキスト ファイルから一意のエントリを選択し、出力ファイルに印刷するにはどうすればよいですか?

複数のテキスト ファイルから一意のエントリを選択し、出力ファイルに印刷するにはどうすればよいですか?

類似したデータを持つ 3 つのファイルがあります。3 つのファイルを読み取り、一意のエントリとその値を出力できる bash スクリプトが必要です。例:

1.txt
aceE    14
aceF    8
adhE    20
asnS    2
carB    2
dnaK    3
eno     2

2.txt
aceE    11
aceF    7
acnB    2
acrB    1
adhE    22
asnS    2
dapD    3

3.txt
aceE    16
aceF    10
adhE    18
aroK    2
asnS    3
dapD    4
dnaK    4

出力は次のようになります。

acnB    2
acrB    1
aroK    2
carB    2
eno     2

答え1

GNUuniqまたは互換バージョンの場合 (オプション-w):

sort {1,2,3}.txt | uniq -u -w5
acnB    2
acrB    1
aroK    2
carB    2
eno     2

編集: 最初のフィールドの長さをもう少し柔軟にするには、guillermo のアプローチの一部を実装できます。

grep -f <(sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u) <(sort {1,2,3}.txt)

結局のところ、入力ファイル内の区切り文字は であり<tab>、 ではありません<space>。これは、入力ファイルを質問に貼り付けることで変更されました。 :-(
それでも、 で動作するはずです<tab>

grep -f <(sort {1,2,3}.txt | cut -f1 | uniq -u) <(sort {1,2,3}.txt)

答え2

私はこれを提案します:

sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u | xargs -I '{}' grep -h "{}" {1,2,3}.txt

ファイルの内容を並べ替えます。

sort {1,2,3}.txt

最初の列だけを出力します。

cut -d' ' -f1

ユニークフィルター:

uniq -u

acnB
acrB
aroK
carB
eno

出力フィードの場合grep:

xargs -I '{}' grep -h "{}" {1,2,3}.txt

acnB    2
acrB    1
aroK    2
carB    2
eno     2

答え3

awk

awk '
  n[$1]++ {delete s[$1]; next}
  {s[$1] = $0}
  END {for (i in s) print s[i]}' [123].txt

答え4

ミラーの使用(https://github.com/johnkerl/miller)とランニング

mlr --csv --fs "\t" -N count-similar -g 1 then filter '$count==1' then cut -x -f count 1.txt  2.txt 3.txt

あなたは

carB    2
eno     2
acnB    2
acrB    1
aroK    2

関連情報