Imprime linhas comuns entre dois arquivos junto com seus números de linha nesses arquivos

3

Eu tenho dois arquivos. Eu quero comparar o conteúdo de um arquivo com o outro. Se houver uma linha correspondente entre os dois arquivos, imprima a linha e seu número de linha em cada arquivo. Exemplo:

Arquivo 1:

ABC
PQR
MNO
XYZ

Arquivo 2:

qqqq
wewe
ABC
acdd
abcc
nop
MNO

Resultado esperado:

ABC       1      3
MNO       3      7
..
    
por MOHASIN 26.11.2015 / 06:41

2 respostas

2

Com awk , você pode processar o primeiro arquivo, armazenar as linhas ( $0 ) e os números de linha correspondentes ( NR ) (como índices / valores) em uma matriz associativa ( l[$0] ) e processar segundo arquivo e se uma linha estiver no índice da matriz, imprima-o junto com o valor de l[$0] e o número da linha atual ( FNR ):

awk 'FNR==NR{l[$0]=NR; next}; $0 in l{print $0, l[$0], FNR}' file1 file2
    
por 26.11.2015 / 16:23
1
#!/bin/sh

count_match() {
    grep -x -n -F -f "$1" "$2" | sed 's/\([0-9]*\):\(.*\)/ /' | sort
}

count_match file2 file1 > /tmp/$$A
count_match file1 file2 > /tmp/$$B
join /tmp/$$[AB]

rm /tmp/$$[AB]

Estas são as opções grep usadas:

-n imprime números de linha correspondentes
-x corresponde apenas a linhas inteiras% -F corresponde a strings literais - sem expressões regulares
-f filename lê os padrões de pesquisa de um arquivo (em nosso case ou arquivo1 ou arquivo2)

Use sed para mudar a ordem dos campos e soltar os dois pontos : .

sort da saída.

join o conteúdo dos dois arquivos temporários.

Isso demonstra o uso e a saída de comandos no exemplo acima:

$ grep -n -F -f file2 file1
1:ABC
3:MNO
$
$ grep -x -n -F -f file2 file1 | sed 's/\([0-9]*\):\(.*\)/ /' 
ABC 1
MNO 3
$
$ grep -x -n -F -f file1 file2 | sed 's/\([0-9]*\):\(.*\)/ /'
ABC 3
MNO 7
$ 
    
por 26.11.2015 / 07:06