Eu tenho 3 arquivos com dados semelhantes. Eu quero um script bash que possa ler os 3 arquivos e gerar as entradas exclusivas com seus valores. Exemplo:
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
Portanto, a saída deve ser semelhante a:
acnB 2
acrB 1
aroK 2
carB 2
eno 2
Responder1
Com GNU uniq
ou compatível (para a -w
opção):
sort {1,2,3}.txt | uniq -u -w5
acnB 2
acrB 1
aroK 2
carB 2
eno 2
editar: para ser um pouco mais flexível com os comprimentos do primeiro campo, algumas das abordagens de Guillermo poderiam ser implementadas.
grep -f <(sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u) <(sort {1,2,3}.txt)
Acontece que o delimitador nos arquivos de entrada é <tab>
e não <space>
. Isso foi alterado colando os arquivos de entrada na pergunta. :-(
No entanto, isso deve funcionar com <tab>
.
grep -f <(sort {1,2,3}.txt | cut -f1 | uniq -u) <(sort {1,2,3}.txt)
Responder2
Eu proponho isto:
sort {1,2,3}.txt | cut -d' ' -f1 | uniq -u | xargs -I '{}' grep -h "{}" {1,2,3}.txt
Classifique o conteúdo dos arquivos:
sort {1,2,3}.txt
Produza apenas a primeira coluna:
cut -d' ' -f1
Filtrar únicos:
uniq -u
acnB
acrB
aroK
carB
eno
Com o feed de saída grep
:
xargs -I '{}' grep -h "{}" {1,2,3}.txt
acnB 2
acrB 1
aroK 2
carB 2
eno 2
Responder3
Com awk
:
awk '
n[$1]++ {delete s[$1]; next}
{s[$1] = $0}
END {for (i in s) print s[i]}' [123].txt
Responder4
Usando Miller (https://github.com/johnkerl/miller) e correndo
mlr --csv --fs "\t" -N count-similar -g 1 then filter '$count==1' then cut -x -f count 1.txt 2.txt 3.txt
voce terá
carB 2
eno 2
acnB 2
acrB 1
aroK 2