Remove linha de um arquivo que é nomeado em outro

5

Eu tenho a seguinte lista:

NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0

E eu tenho outro arquivo com apenas a primeira coluna:

NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042

Eu quero remover as linhas inteiras do primeiro arquivo que é nomeado como o segundo. Nesse caso, o arquivo de saída será:

NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0

(removendo NM_000022 e NM_00023 com seus valores correspondentes)

Obrigado !!

    
por Joan Gibert Fernandez 28.09.2016 / 12:43

3 respostas

6

com awk :

awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt

Insira o arquivo com apenas uma única coluna como o primeiro argumento e o primeiro a verificar a associação (primeira coluna) como o segundo argumento.

  • NR==FNR {a[$0]; next} , aqui NR==FNR só será verdadeiro para o primeiro arquivo, então salvamos cada linha no array a para que possamos fazer o teste de associação para o primeiro argumento do segundo arquivo, então nós estamos indo para a próxima linha sem qualquer outra operação no segundo arquivo

  • {if ($1 in a) next}; 1 será executado apenas para o segundo arquivo, o que deve ser verificado, aqui estamos verificando se o primeiro espaço separado em branco está no array a , se estiver presente, indo para a próxima linha, caso contrário imprimindo a linha inteira.

Exemplo:

$ cat f1.txt 
NM_000031
NM_000032
NM_000033
NM_000034
NM_000022
NM_000035
NM_000036
NM_000037
NM_000023
NM_000038
NM_000039
NM_000040
NM_000041
NM_000042

$ cat f2.txt 
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000022 0
NM_000023 0
NM_000024 8
NM_000025 0
NM_000026 0

$ awk 'NR==FNR {a[$0]; next}; {if ($1 in a) next}; 1' f1.txt f2.txt
NM_000014 3
NM_000015 0
NM_000016 0
NM_000017 0
NM_000018 0
NM_000019 28
NM_000020 0
NM_000021 0
NM_000024 8
NM_000025 0
NM_000026 0
    
por heemayl 28.09.2016 / 12:50
2

Você também pode usar sed com um loop de Bash.

Este comando modifica file1 no lugar (criando um backup file1.bak ), removendo todas as linhas que começam com qualquer linha de file2 :

while read line ; do sed -i.bak "/$line.*/d" file1 ; done < file2
    
por Byte Commander 28.09.2016 / 14:46
1

Como está o comando 'grep' aqui:)

grep -Fvf oneColumnedFile listFile > outfile
    
por devWeek 28.09.2016 / 15:12