Quero criar um arquivo que contenha colunas de dois arquivos de entrada. Arquivo1 é como:
aa 32
bb 15
cc 78
O arquivo2 é:
fa 19
bc 23
cc 50
de 28
aa 45
bb 31
A tarefa é ler o Arquivo1, se o 1º campo de uma linha existir entre o 1º campo do Arquivo2, então imprimir essa linha do Arquivo2, com ambas as colunas e adicionar a 2ª entrada da coluna do Arquivo1 contendo o 1º campo.
A saída deve ser como:
aa 45 32
bb 31 15
cc 50 78
awk é preferido para o script.
Responder1
$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78
Explicação:
awk
percorre implicitamente cada arquivo, uma linha por vez. Como o demos file2
como primeiro argumento, ele é lido primeiro. file1
é lido em segundo lugar.
FNR==NR{a[$1]=$2;next}
NR
é o número de linhasawk
lidas até agora eFNR
é o número de linhasawk
lidas até agora do arquivo atual. Assim, seFNR==NR
, ainda estamos lendo o primeiro arquivo nomeado:file2
. Para cada linha emfile2
, atribuímosa[$1]=$2
.Aqui,
a
está ummatriz associativaea[$1]=$2
significa salvar a segunda coluna do arquivo2, denotada$2
como um valor na matriza
usando a primeira coluna do arquivo2,$1
como chave.next
dizawk
para pular o resto dos comandos e começar de novo com a próxima linha.($1 in a) {print $1,a[$1],$2}
Se chegarmos aqui, significa que estamos lendo o segundo arquivo:
file1
. Se vimos o primeiro campo da linha emfile2
, conforme determinado pelo conteúdo do arraya
, então imprimimos uma linha com os valores do campo 2 de ambos os arquivos.
Responder2
Gosto da solução awk, mas acho que pode ser mais fácil:
sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2
A opção -o
substituirá o formato que você selecionará como primeiro campo do primeiro arquivo, segundo campo do segundo arquivo e segundo campo do primeiro arquivo.
Responder3
Junte o segundo arquivo File2
ao primeiro arquivo, File1
.
join <(sort -k1 file2) <(sort -k1 file1)