Enquanto lê loop com grep

0

Eu tenho um arquivo csv com muitas linhas e preciso encontrar algumas correspondências e enviá-las para um arquivo. Meus dados são assim:

Arquivo 1

qwerty
asdfgh
zxcvbn
qwerty
aassdd
zzxxcc
yyuuii
tttttt

Eu preciso corresponder:

Arquivo 2

qwert
tttttt
aassdd.

Como meu arquivo é grande e minha lista de correspondência é longa, estou fazendo isso:

while read n ; do grep $n File_1.csv >> results.csv ; done < File_2.csv

Não consigo obter o resultado que queria.

    
por happy 30.05.2017 / 11:53

3 respostas

3

Você não precisa fazer um loop; a opção -f pega um arquivo com os padrões para procurar:

grep -Ff File_2.csv File_1.csv > results.csv

Também adicionei a opção -F para que os termos de pesquisa sejam tratados literalmente, não como regex.

    
por 30.05.2017 / 12:05
1

O utilitário grep pode ler padrões de um arquivo e combiná-los com o conteúdo de outro arquivo. Nenhum loop no shell é necessário.

$ grep -f patterns file

Usando os dois arquivos que você tem em sua pergunta (o arquivo 1 é file enquanto o arquivo 2 é patterns ), isso produz

qwerty 
qwerty 
tttttt 

Para corresponder aos padrões de patterns como sequências fixas (não expressões regulares), adicione -F :

$ grep -F -f patterns file

Para o exemplo dado, isso produz o mesmo resultado que sem -F .

Para forçar a correspondência em linhas completas, adicione -x :

$ grep -x -F -f patterns file
tttttt   

Como qwerty não corresponde a qwert completamente, essas linhas não são retornadas.

    
por 30.05.2017 / 14:59
0

Se cada arquivo não tiver duplicatas, você poderá fazer o seguinte:

# In file_1 and file_2
sort file_1 file_2 | uniq -d
# In file_1 or file_2 but not both
sort file_1 file_2 | uniq -u
# In file_1 and not file_2
sort file_1 file_2 | uniq -d | sort - file_1 | uniq -u
# In file_2 and not file_1
sort file_1 file_2 | uniq -d | sort - file_2 | uniq -u
    
por 30.05.2017 / 14:36

Tags