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 1significa 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 comandosortcomo 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-