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 -f
opçã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 -F
opçã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 grep
utilitá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 é file
enquanto o arquivo 2 é patterns
), isso produz
qwerty
qwerty
tttttt
Para combinar com os padrões de patterns
strings 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 qwert
completamente, essas linhas não são retornadas.