Como comparar dois arquivos, para que a informação no primeiro seja excluída do segundo? [duplicado]

3

Basicamente, eu tinha um arquivo, que continha cerca de 90 nomes de usuários.

Eu tive que excluir todos os nomes de usuários do arquivo passwd, que era um total de 300 linhas.

Eu tentei criar uma maneira de pelo menos filtrar os nomes de usuário duplicados e imprimir os que precisam permanecer, mas não tiveram sucesso.

Digamos que o arquivo, no qual eu tinha 90 nomes de usuários para remoção, contenha:

arquivo.txt

user1
user2
user3
user4

O arquivo passwd contém esses nomes de usuário, além de muito mais

passwd

user31
user32
user1
user23
user2
user4
user15
user3

Os nomes de usuários dentro do arquivo passwd foram distribuídos aleatoriamente dentro do arquivo, então diff -y não teria feito o trabalho.

Meu objetivo aqui era comparar os dois arquivos, por exemplo cat the file.txt e usar a saída para pesquisar dentro do passwd. O resultado deve ser uma remoção das linhas duplicadas ou uma impressão das linhas exclusivas.

    
por George.S 17.01.2018 / 20:26

3 respostas

6

O comando comm pode ser usado para comparar e contrastar dois arquivos classificados:

comm <(sort file.txt) <(cut -d: -f1 /etc/passwd | sort)
  • A primeira coluna contém linhas do primeiro arquivo que não aparecem no segundo arquivo.
  • A segunda coluna contém linhas do segundo arquivo que não aparecem no primeiro arquivo.
  • A terceira coluna contém linhas que aparecem nos dois arquivos.

Você pode omitir uma ou duas colunas da saída de três colunas ( comm -13 ... omitirá as colunas 1 e 3, por exemplo).

Não perguntado em sua pergunta, mas solicitado em um comando de acompanhamento, é como obter uma lista de nomes de usuários e extrair as entradas correspondentes de /etc/passwd :

( echo root; echo sys ) | sed -r 's!(.*)!^:!' | grep -f - /etc/passwd
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/usr/sbin/nologin
    
por 17.01.2018 / 22:03
6

Acho que a maneira mais fácil de fazer é:

grep -v -x -f file_infotodelete reference_file  > result_file  
    
por 17.01.2018 / 20:34
0

Use abaixo o awk one liner para conseguir.

Abaixo, o comando excluirá o conteúdo file.txt do arquivo passwd. Testado funcionou bem

awk 'NR==FNR{a[$1];next}!($1 in a){print $1}' file.txt passwd
    
por 18.01.2018 / 03:48