Ich habe 3 Dateien mit ähnlichen Daten. Ich möchte ein Bash-Skript, das die 3 Dateien lesen und die eindeutigen Einträge mit ihren Werten ausgeben kann. Beispiel:
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
Die Ausgabe sollte also etwa so aussehen:
acnB 2
acrB 1
aroK 2
carB 2
eno 2
Antwort1
Mit GNU uniq
oder kompatibel (für die -w
Option):
sort {1,2,3}.txt | uniq -u -w5
acnB 2
acrB 1
aroK 2
carB 2
eno 2
Bearbeiten: Um bei der Länge des ersten Felds etwas flexibler zu sein, könnten einige von Guillermos Ansätzen implementiert werden.
grep -f <(sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u) <(sort {1,2,3}.txt)
Wie sich herausstellt, sind die Trennzeichen in den Eingabedateien <tab>
und nicht <space>
. Dies wurde geändert, indem die Eingabedateien in die Frage eingefügt wurden. :-(
Trotzdem sollte dies mit funktionieren <tab>
.
grep -f <(sort {1,2,3}.txt | cut -f1 | uniq -u) <(sort {1,2,3}.txt)
Antwort2
Ich schlage Folgendes vor:
sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u | xargs -I '{}' grep -h "{}" {1,2,3}.txt
Sortieren Sie den Inhalt der Dateien:
sort {1,2,3}.txt
Geben Sie nur die erste Spalte aus:
cut -d' ' -f1
Unikate filtern:
uniq -u
acnB
acrB
aroK
carB
eno
Mit dem Ausgabe-Feed grep
:
xargs -I '{}' grep -h "{}" {1,2,3}.txt
acnB 2
acrB 1
aroK 2
carB 2
eno 2
Antwort3
Mit awk
:
awk '
n[$1]++ {delete s[$1]; next}
{s[$1] = $0}
END {for (i in s) print s[i]}' [123].txt
Antwort4
Mit Miller (https://github.com/johnkerl/miller) und läuft
mlr --csv --fs "\t" -N count-similar -g 1 then filter '$count==1' then cut -x -f count 1.txt 2.txt 3.txt
du wirst haben
carB 2
eno 2
acnB 2
acrB 1
aroK 2