comparando a primeira coluna de dois arquivos e imprimindo a linha inteira do segundo arquivo se as primeiras colunas corresponderem

4

Eu tenho dois arquivos nesses formatos:

arquivo1:

air
smell
hand
dude
road
cat

arquivo 2:

air,4,21,01,13,3,2
smell,21,4,2,5,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
hand,1,4,2,1,6
mouse,1,3,5,6,2

o que eu quero fazer é imprimir a linha inteira do arquivo 2, se a primeira cadeia na coluna 1 do arquivo 2 for encontrada no arquivo 1, e eu quiser manter a ordem do arquivo 1.

resultado esperado:

air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
    
por Nolohice 16.07.2015 / 18:50

3 respostas

3

Isso deve ser feito:

awk -F, 'FNR==NR {a[$1]; next}; $1 in a' file1 file2

editar:

Interpretou o arquivo errado para a encomenda. Uma nova tentativa (requer gawk se isso for aceitável)

gawk -F, '
    FNR==NR {a[NR]=$1; next}; 
    {b[$1]=$0}
    END{for (i in a) if (a[i] in b) print b[a[i]]}
' file1 file2

edição 2:

Com nowmal awk e trocando os arquivos:

awk -F, 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' file2 file1
    
por 16.07.2015 / 19:02
3
join -t, -1 2 -2 1 <(nl -s, -ba -nrz file1 | sort -t, -k2) \
<(sort -t, -k1 file2) | sort -t, -k2 | cut -d, -f1,3-

As linhas em file1 são numeradas e o resultado é sort ed no 2º campo. Este é então join ed com file2 ( sort ed no 1º campo):

air,000001,4,21,01,13,3,2
cat,000006,1,5,6,3,1
dude,000004,1,31,42,1
hand,000003,1,4,2,1,6
road,000005,1,4,2,1,4
smell,000002,21,4,2,5,6

o resultado é então sort ed no 2º campo (ou seja, os números de linha) para restaurar a ordem da linha original e, em seguida, o mesmo 2º campo é removido com cut :

air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
    
por 22.05.2018 / 15:32
0

Você pode usar o comando grep simples.

grep -f file1 file2
    
por 29.10.2015 / 20:09

Tags