Como posso adicionar uma coluna a um arquivo que corresponda a outra coluna?

Como posso adicionar uma coluna a um arquivo que corresponda a outra coluna?

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 file1na 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 bashqualquer 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==FNRgarante que {ar[$2]=$0;next}funcionará apenas para o primeiro arquivo porque após a leitura o primeiro arquivo FNRseria definido como zero. Na expressão , {ar[$2]=$0;next}um array arindexado $2é criado e nextnenhuma 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 aro 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 arestá indexado em $2 do primeiro arquivo. Portanto, isso verifica se $1o segundo arquivo corresponde $2ao primeiro arquivo.

informação relacionada