Saída de linhas comuns de 2 arquivos e linhas incomuns de ambos os arquivos em um arquivo de saída

3

Eu tenho 2 arquivos de texto. Vamos nomeá-los como arquivo1.txt e arquivo2.txt

file1.txt é o seguinte

chr10   181144  225933
chr10   181243  225933
chr10   181500  225933
chr10   226069  255828
chr10   255989  267134
chr10   255989  282777
chr10   267297  282777
chr10   282856  283524
chr10   283618  285377
chr10   285466  285995

file2.txt é o seguinte

chr10   181144  225933
chr10   181243  225933
chr10   181500  225933
chr10   255989  282777
chr10   267297  282777
chr10   282856  283524
chr10   375542  387138
chr10   386930  387138
chr10   387270  390748
chr10   390859  390938
chr10   391051  394580
chr10   394703  395270

O que eu quero imprimir em um único arquivo é

  1. Todas as linhas comuns entre file1 e file2
  2. Todas as linhas que estão no arquivo1, mas não são comuns a ambas
  3. Todas as linhas que estão no arquivo2, mas não são comuns a ambos.

Eu escrevi um script Perl para fazer isso, mas tenho certeza que deve haver uma linha de comando ou uma maneira mais fácil de fazer isso.

    
por user3138373 12.09.2014 / 20:12

2 respostas

6

Linhas comuns aos dois arquivos:

comm -12 file1.txt file2.txt > results.txt

Adicione linhas exclusivas ao arquivo1.txt:

comm -23 file1.txt file2.txt >> results.txt

Adicione linhas exclusivas ao arquivo2.txt:

comm -13 file1.txt file2.txt >> results.txt

Se os arquivos ainda não estiverem classificados, você deve fazer isso primeiro, por exemplo, se o seu shell suportar substituição de processo

comm -12 <(sort file1.txt) <(sort file2.txt)

etc.

    
por 12.09.2014 / 20:22
5

Existe um comando comm para realizar este trabalho. Mas você pode fazer isso combinando outras ferramentas padrão, como grep , sort , uniq , join . Aqui está uma solução use grep , com equivalente usando comm .

Linhas comuns aos dois arquivos:

grep -xF -f file1 file2

comm -12 <(sort -u file1) <(sort -u file2)

Linhas apenas em file1 :

grep -vxF -f file2 file1

comm -23 <(sort -u file1) <(sort -u file2)

Linhas apenas em file2 :

grep -vxF -f file1 file2

comm -13 <(sort -u file1) <(sort -u file2)
    
por 12.09.2014 / 20:31