Aqui está uma maneira:
$ awk -F"[, ]" 'NR==FNR{a[$1]=$1","$2; next} ($2 in a){print a[$2]","$1}' file1 file2
1000,Brian,3044
400,Nick,4466
1010,Jason,1206
O -F"[, ]"
define o separador de campos como um espaço ou uma vírgula. FNR
é o número da linha atual e NR
do número da linha atual do arquivo atual. Os dois serão iguais apenas enquanto o primeiro arquivo estiver sendo lido. Portanto, NR==FNR{a[$1]=$1","$2; next}
será executado apenas nas linhas do primeiro arquivo e salvará o primeiro e o segundo campos (com uma vírgula no meio) como valores na matriz a
cujas chaves são os primeiros campos. Então, quando o segundo arquivo estiver sendo lido, se o segundo campo estiver em a
, imprimiremos o valor associado a ele (o primeiro e o segundo campos do primeiro arquivo) e o primeiro campo do segundo arquivo.
Dito isso, há realmente um aplicativo para isso! Esse tipo de coisa é para o qual join
foi feito. Infelizmente, como os seus dois arquivos não estão classificados e possuem diferentes delimitadores, precisamos de alguns truques. Se o seu shell suporta <()
, você pode fazer:
$ join -t, -1 1 -2 2 <(sort file1) <(sed 's/ /,/g' file2 | sort -t"," -k2)
1000,Brian,3044
1010,Jason,1206
400,Nick,4466
O join -t, -1 1 -2 2
significa usar ,
como o delimitador e unir no primeiro campo do arquivo1 e no segundo campo do arquivo2. O sed
apenas substitui espaços por vírgulas, por isso temos o mesmo delimitador em ambos os arquivos. O sort
faz o que diz na garrafa: classifica sua entrada.