Como posso combinar a primeira coluna do arquivo 1 de acordo com os números da segunda coluna com o arquivo 2?
Arquivoarquivo1
k002 25
k004 54
k003 23
Arquivoarquivo2
25 h
23 j
54 hg
Saída desejada
k002 25 h
k003 23 j
k004 54 hg
Não tenho ideia de como fazer isso e não encontrei perguntas semelhantes.
awk 'matching {print ... $1, $2}' file1 file2 > file_des
Responder1
Você talvez pudesse fazer algo assim:
awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2
Onde:
FNR
: O número do registro de entrada no arquivo de entrada atual.NR
: O número total de registros de entrada vistos até agora.
Observe que isso será lido inteiro file1
na memória.
Responder2
Se você não se importa em preservar a ordem original dos arquivos, você pode usar join
:
# sort the first file:
sort -k2 file1 > nfile1
# Sort the second file:
sort file2 > nfile2
join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file
Ou, como sugerido por @Ed Morton, se você usar bash
qualquer outro shell que suporte a substituição de processos, poderá evitar a criação de arquivos temporários desta forma:
join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)
Responder3
Usando awk
:
awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2
Neste comando NR==FNR
garante que {ar[$2]=$0;next}
funcionará apenas para o primeiro arquivo porque após a leitura o primeiro arquivo FNR
seria definido como zero. Na expressão , {ar[$2]=$0;next}
um array ar
indexado $2
é criado e next
nenhuma ação adicional é executada.
A expressão ($1 in ar)
vê se $1
(primeiro campo do segundo arquivo) está presente emíndicesde matriz ar
. Se presente, isso imprime ar
o segundo campo do segundo arquivo por esta instrução {print ar[$1],$2}
.
($1 in ar)
é importante porque isso significa se $1 do segundo arquivo correspondeíndicesde ar
. E ar
está indexado em $2 do primeiro arquivo. Portanto, isso verifica se $1
o segundo arquivo corresponde $2
ao primeiro arquivo.