類似したデータを持つ 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