ti-enxame.com

encontrar conteúdo de um arquivo em outro arquivo no script unix Shell

Eu estou usando o seguinte script Shell para encontrar o conteúdo de um arquivo em outro:

#!/bin/ksh
file="/home/nimish/contents.txt"

while read -r line; do
    grep $line /home/nimish/another_file.csv
done < "$file"

Estou executando o script, mas ele não está exibindo o conteúdo do arquivo csv. Meu arquivo contents.txt contém números como "08915673" ou "123223" que estão presentes no arquivo csv também. Há algo de errado que estou fazendo?

9
NIMISH DESHPANDE

grep em si é capaz de fazer isso. Basta usar a bandeira -f:

grep -f <patterns> <file>

<patterns> é um arquivo contendo um padrão em cada linha; e <file> é o arquivo no qual você deseja pesquisar as coisas.

Observe que, para forçar grep a considerar cada linha como um padrão, mesmo que o conteúdo de cada linha pareça uma expressão regular, use o sinalizador -F, --fixed-strings.

grep -F -f <patterns> <file>

Se o seu arquivo é um CSV, como você disse, você pode fazer:

grep -f <(tr ',' '\n' < data.csv) <file>

Como exemplo, considere o arquivo "a.txt", com as seguintes linhas:

alpha
0891234
beta

Agora, o arquivo "b.txt", com as linhas:

Alpha
0808080
0891234
bEtA

A saída do seguinte comando é:

grep -f "a.txt" "b.txt"
0891234

Você não precisa de todo para for-loop aqui; grep em si oferece esse recurso.


Agora, usando seus nomes de arquivos:

#!/bin/bash
patterns="/home/nimish/contents.txt"
search="/home/nimish/another_file.csv"
grep -f <(tr ',' '\n' < "${patterns}") "${search}"

Você pode alterar ',' para o separador que você tem em seu arquivo.

29
Rubens

Outra solução

  • use awk, crie seu próprio hash (por exemplo, ahash), tudo por si mesmo.
  • substitua $0 to $i, você pode combinar os campos desejados.

awk -F"," '
{  
   if (nowfile==""){ nowfile = FILENAME;  }

   if(FILENAME == nowfile)
   {
     hash[$0]=$0;
   }
   else
   {
       if($0 ~ hash[$0])
       {  
           print $0
       }
   }
} '  xx yy
2
sharingli

Eu não acho que você realmente precisa de um script para executar o que você está tentando fazer.

Um comando é suficiente. No meu caso, precisava de um número de identificação na coluna 11 em um arquivo csv (com ";" como separador)

grep -f <(awk -F";" '{print $11}' FILE_TO_EXTRACT_PATTERNS_FROM.csv) TARGET_FILE.csv 

Eu espero que isso ajude.

1
Philippe Delteil