Saída de pesquisa do AWK em outro arquivo

4

Eu tenho dois arquivos fileA e fileB.

Eu tenho que extrair a coluna1 do arquivoA como awk '{print }' e, em seguida, a saída será pesquisada em outro arquivoB e salvará os registros correspondentes em um novo arquivo fileC em palavras simples como:

fileA :

seg1     rec1
seg2     rec2
seg3     rec3 

Eu preciso recuperar a coluna 1 usando o comando awk e essa coluna 1 é pesquisada em fileB para recuperar os registros como:

fileB :

seg1     one
seg2     two
seg3     three
seg4     four
seg5     five

Do arquivo A, os dados da coluna 1 são extraídos e e esses dados são usados para pesquisar no arquivo B e o registro correspondente é salvo em um arquivo de teste. Minha saída deve ser assim:

fileC :

seg1       one
seg2       two
seg3       three
    
por ASAD 19.12.2016 / 12:38

5 respostas

7

Pode ser alcançado facilmente com awk da seguinte forma:

awk 'NR==FNR{inFileA[]; next} ( in inFileA)' fileA fileB > write_to_fileC

resultado,

seg1       one
seg2       two
seg3       three

acima, primeiro estamos lendo o arquivoA e retém toda a coluna1 em um array chamado inFileA , então olha no arquivoB para sua primeira coluna e se é correspondido com a coluna1 salva do arquivoA, em seguida, vai imprimir toda a linha do arquivoB.

    
por αғsнιη 19.12.2016 / 13:27
4

Se as colunas a serem comparadas forem classificadas, você poderá usar join :

join -o 2.1,2.2 file1 file2

join corresponde a colunas classificadas de arquivos de entrada e as imprime. -o 2,1,2.2 restringe a saída à primeira e segunda colunas do segundo arquivo de entrada.

    
por muru 19.12.2016 / 13:45
3

Você pode usar o seguinte one-liner:

cut -f1 fileA | grep -f - fileB > fileC
  • o comando cut extrairá a primeira coluna de fileA (assumindo a separação de guias. use -d para especificar outra coisa)
  • o comando grep obtém a saída de cut e pesquisa fileB para todas as sequências.
  • a saída será gravada em fileC
por Wayne_Yux 19.12.2016 / 13:25
2

Você já recebeu algumas respostas excelentes. Só para adicionar ao mix, aqui está uma abordagem Perl:

$ perl -ane '$i ? $k{$F[0]} && print : { $k{$F[0]}++ }; $i++ if eof' fileA fileB
seg1     one
seg2     two
seg3     three

E uma versão de golfe da resposta de KasiyA :

$ awk 'NR==FNR ? a[] :  in a' fileA fileB 
seg1     one
seg2     two
seg3     three

E aqui está uma solução grep meio complicada:

$ grep -Ff <(grep -oP '^\S+' fileA) fileB
seg1     one
seg2     two
seg3     three
    
por terdon 19.12.2016 / 16:21
1

Uma tentativa com script bash. (Lembre-se de tornar executável.)

fileA e fileB devem existir na mesma pasta do script.

Um script geral que funcionará para quaisquer dois arquivos descritos com script e gerará o arquivo com o texto correspondente como <fa>_<fb>_match.txt :

Para usar isso, execute ./script_name.sh fileA fileB

#!/bin/bash
fa=""  # first file- which has  columns
fb=""  # second file - which has  raw data to be searched
# file with name <fa>_<fb>_match.txt will be generated.

myarr=($(awk 'NR>1 {print }' "$fa")) # NR makes awk to ignore first row.

for index in ${!myarr[@]}; do
    #echo $index/${#myarr[@]}
    #echo    "${myarr[index]}"
text="${myarr[index]}"
grep -w -F "$text" $fb  >>  $fa"_"$fb"_match".txt
done

# file with name <fa>_<fb>_match.txt will be generated.
    
por ankit7540 19.12.2016 / 13:13