Imprime a string se estiver presente em duas colunas separadas

1

Eu tenho um arquivo de texto com duas colunas e quero imprimir apenas as cadeias que estão presentes em ambos. Por exemplo:

column1       column2

stringA       stringZ
stringP       stringT
stringZ       stringX
stringE       stringR
stringT       stringG

Resultado esperado:

stringZ
stringT
    
por Manuel 24.07.2017 / 23:19

4 respostas

3

Desprezivelmente roubado de @cherdt com algumas melhorias (assume um shell como zsh ou bash com suporte para ksh - como substituição de processo):

f=filename; comm -12 <(cut -f1 < "$f" |sort) <(cut -f2 < "$f" | sort)
  • Manter o nome do arquivo na variável não ajuda a repeti-lo
  • Não é necessário gravar em arquivos e comparar. Escrever em arquivos geralmente requer que sejam apagados depois para limpeza. Não faça isso com arquivos enormes. A substituição do processo faz com que pareça que comm está lendo arquivos, enquanto é stdout redirecionando para um fd temporário
por 25.07.2017 / 16:27
2

Com solução awk diferente e fácil

awk 'NR==FNR{seencol1[$1]++;next} ($2 in seencol1)' infile.txt infile.txt 

saída,

stringZ
stringT
    
por 25.07.2017 / 18:00
1

Você pode usar comm para comparar 2 arquivos, portanto, primeiro gere um arquivo classificado para cada coluna:

  1. cat filename | cut -f1 | sort > column1
  2. cat filename | cut -f2 | sort > column2

Em seguida, suprima as duas primeiras colunas de comm para exibir apenas as linhas nas quais os dados existem em ambos os arquivos:

comm -12 col1 col2

    
por 24.07.2017 / 23:35
1
awk 'NF!=1{cola[$1]++; colb[$2]++} END { for (item in cola ) { if( colb[item]>0 ) { print item } }' /path/to/input
    
por 24.07.2017 / 23:37