Durante a leitura do loop com grep

Durante a leitura do loop com grep

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

Arquivo 1

qwerty
asdfgh
zxcvbn
qwerty
aassdd
zzxxcc
yyuuii
tttttt

Eu preciso combinar:

Arquivo 2

qwert
tttttt
aassdd.

Como meus arquivos são grandes e minha lista de correspondência é longa, estou fazendo o seguinte:

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

Não consigo obter o resultado que queria.

Responder1

Você não precisa fazer um loop; a -fopção leva um arquivo com os padrões a serem pesquisados:

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

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

Responder2

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

Responder3

O greputilitário pode ler padrões de um arquivo e compará-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 na sua pergunta (o arquivo 1 é fileenquanto o arquivo 2 é patterns), isso produz

qwerty 
qwerty 
tttttt 

Para combinar com os padrões de patternsstrings 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 qwertynão corresponde qwertcompletamente, essas linhas não são retornadas.

informação relacionada