O utilitário join
mescla linhas de dois arquivos baseados em uma coluna comum. Requer que os arquivos sejam classificados nessa coluna.
join -t $'\t' -1 10 -2 1 -o 2.1,2.2,1.7 <(sort -t $'\t' -k10 file1) <(sort -t $'\t' file2)
-
$'\t'
é um caractere de tabulação,-t $'\t'
diz para usar isso como o separador de campo. -
join -1 10 -2 1
significa juntar linhas quando o campo 10 do primeiro arquivo corresponde ao campo 1 do segundo arquivo. -
-o …
lista os campos a serem impressos. -
<(sort …)
usa a saída do comandosort
como uma das entradas dejoin
.
$'…'
e <(…)
requerem ksh ou bash, eles não funcionam de forma simples.
Se file2
já estiver classificado, você poderá usá-lo, o que funciona na forma sh:
sort -t $'\t' -k10 file1 |
join -t "$(printf \t)" -1 10 -2 1 -o 2.1,2.2,1.7 - file2
Se você deseja preservar a ordem de um dos arquivos, ainda é possível usar join
, mas primeiro adicionar números de linha e, no final, classificar pelos números de linha originais. Por exemplo, para preservar a ordem de file2
:
join -t $'\t' -1 10 -2 1 -o 2.1,2.2,2.3,1.7 \
<(sort -t $'\t' -k10 file1) \
<(<file2 nl | sort -t $'\t' -k 2,2) |
sort | cut -d $'\t' -f 2-