O script a seguir deve fazer uma junção externa na coluna (campo) 1 de todos os arquivos delimitados por tabulação passados como argumentos. Ele usa o comando join , que faz uma junção externa em arquivos classificados, 2 arquivos de cada vez .
Ele se juntará a todas as linhas dos arquivos, incluindo as linhas de cabeçalho. Se você quiser que os cabeçalhos sejam excluídos, altere os dois comandos sort
para algo que produza um arquivo classificado que os omita.
#!/bin/sh
if test $# -lt 2
then
echo usage: gjoin file1 file2 ...
exit 1
fi
sort -t $'\t' -k 1 "$1" > result
shift
for f in "$@"
do
sort -t $'\t' -k 1 "$f" > temp
join -1 1 -2 1 -t $'\t' result temp > newresult
mv newresult result
done
cat result
rm result temp
Se você tem um shell mais antigo, $'\t'
não será substituído por um tab, então você precisará usar ' TAB ' , onde você coloca uma tabulação literal entre as aspas.
Otimizações são possíveis se, em vez de /bin/sh
, você puder usar um shell moderno como bash ou ksh; por exemplo, as linhas
sort -t $'\t' -k 1 "$f" > temp
join -1 1 -2 1 -t $'\t' result temp > newresult
pode ser substituído por
join -1 1 -2 1 -t $'\t' result <(sort -t $'\t' -k 1 "$f") > newresult