Encontre linhas em (múltiplos) arquivos que contenham a linha dada em um arquivo de entrada

4

Se eu tiver vários arquivos como os seguintes:

file1 :

123
456
789
012

file2 :

line1  922
line2  392
line3  456
line5  291
line6  201
...

file3 :

line1  111
line2  123
line3  19
line5  542
line6  456
...

Qual é a melhor maneira de obter todas as linhas em file1 contidas em uma linha de both file2 e file3 ?

Neste exemplo, seria apenas:

456
    
por galois 19.08.2015 / 07:47

4 respostas

3
grep -of file1 file2|xargs -I {} grep -o "{}" file3

Isso começa pegando a entrada do arquivo1 e alimentando-a linha por linha no arquivo2, retornando o texto exato correspondente, se houver. Em seguida, os resultados, se houver, são alimentados no arquivo3 linha por linha, retornando apenas o texto correspondente.

    
por 19.08.2015 / 08:17
2

Você pode usar join 2 vezes seguidas:

join -1 1 -2 2 -o 1.1 <(join -1 1 -2 2 <(sort file1) <(sort -k2 file2)) <(sort -k2 file3)

Apenas impressões:

465

Primeiro, olhe para o interior join . Ele associa file1 e file2 usando o campo 1 em file1 e o campo 2 em file2 .

Em seguida, tudo isso é associado novamente com file3 . Observe que os arquivos devem ser classificados nos campos de associação ( sort -k ).

    
por 19.08.2015 / 08:15
1
also(){
    sed 'h;                    #save a copy of the line before edits
         s/[]$\./*^[]/\&/g;   #literally quote any metachars
         s|.*|/&/c\|p;        #print first half of sed command
         g;                    #get original copy out of hold space
         s/\/&&/g;' |         #double-up backslashes
    sed  -nf - -- "$@"         #read stdin script -file
}

Essa função usa um arquivo padrão como stdin e um ou mais arquivos de busca como argumentos. Ele grava em sua saída qualquer linha de seu arquivo padrão, que pode ser correspondida em seus arquivos de busca. É cuidadoso reproduzir exatamente o original cada vez. E porque é, você pode usá-lo recursivamente.

also <file1 file2 | also file3
456
    
por 16.10.2015 / 09:48
0

grep deve ser suficiente para sua solução

 grep -o "'grep -of file1 file2'" file3

o grep interno " grep -f file1 file2 " irá grep o padrão presente no arquivo1 e no arquivo2 e o padrão retornado é pesquisado no arquivo3.

    
por 19.08.2015 / 08:17