Obtém interseção entre dois arquivos usando a linha de comando

1

Qual é a maneira mais eficiente de obter a interseção entre dois arquivos:

sort file1 file2 | uniq -d
    
por Abdennour TOUMI 26.05.2014 / 05:11

3 respostas

3

Use a linha de comando grep da seguinte forma:

grep -Fx -f file1 file2
    
por Abdennour TOUMI 26.05.2014 / 05:11
0

Se você quiser combinar o conteúdo de dois arquivos, execute o comando abaixo,

awk 'NR==FNR' file1 file2
    
por Avinash Raj 26.05.2014 / 06:44
0

Deixa o arquivo1 = 'A \ nA' e o arquivo2 = 'A \ nA \ nA'. A interseção é apenas 'A' ou 'A \ nA'? Em outras palavras, é o número de vezes que a mesma linha é exibida em ambos os arquivos relevantes?

Se for apenas "A", isso funcionará:

sort <(sort file1 | uniq) <(sort file2 | uniq) | uniq -d

O problema com a abordagem dada na questão é que, mesmo que não exista uma linha em ambos os arquivos, se ela for repetida em um, ela aparecerá no resultado. Portanto, precisamos remover as repetições nos arquivos primeiro usando sort fileX | uniq .

Se for 'A \ nA', isso funcionará:

sort <(sort file1 | awk '{if ($0 == prev) c++; else c=0; print c, $0; prev = $0;}') <(sort file2 | awk '{if ($0 == prev) c++; else c=0; print c, $0; prev = $0;}') | uniq -d | cut -d' ' -f2-

Eu posso pensar em mais alguns liners (com awk, sort, uniq e cut) mas nenhum deles é muito mais simples que isso. Isso, claro, não significa que não haja soluções mais simples.

    
por S Prasanth 26.05.2014 / 09:34