Problema ao extrair dados do arquivo usando o awk

1

Eu tenho um arquivo de dados grande e quero dividi-lo em arquivos menores com base nos valores da coluna 1. Por exemplo, a coluna 1 tem números de 1 a 10 dez vezes para fazer 100 linhas e eu quero todas as linhas com números '1' ou '2' ou '3' etc. em seu próprio arquivo (de preferência sem classificação). Também não quero executar o comando 10 vezes, por isso gostaria que fosse em um loop.

Meus arquivos são assim:

  • text.txt

  • ID.txt

    1
    2
    3
    4
    

O comando que tentei:

cat ID.txt | while read line; do awk '$1 == ${line}' test.txt >$line.txt;done

Então, para resumir, eu quero ler o valor do arquivo ID.txt, por exemplo, '1' e, em seguida, extrair todas as linhas com '1' na primeira linha e colocá-las em um arquivo chamado 1.txt. para 2, depois para 3, depois para 4, etc.

Mas, de alguma forma, a parte '$ 1 == $ {line}' que eu acho que não está funcionando

    
por haiko 21.10.2015 / 15:16

1 resposta

4

Você está procurando a opção -v para awk :

   -v var=val
   --assign var=val
          Assign the value val to the variable var,  before  execution  of
          the  program  begins.  Such variable values are available to the
          BEGIN rule of an AWK program.

Algo parecido com isto:

cat ID.txt | 
    while read line; do awk -vline="$line" '$1 == l' test.txt >"$line".txt;done

Qual seria melhor expressado como (evitando o uso inútil de gato):

while read line; do 
    awk -vline="$line" '$1 == l' test.txt >"$line".txt;
done < ID.txt

No entanto, isso é muito lento e ineficiente. Você está executando o comando awk em todo o test.txt para cada linha de ID.txt . Por que não apenas ler ID.txt em awk e imprimir as linhas correspondentes:

awk 'NR==FNR{a[$1]++; next} ($1 in a){print >> $1".txt"}' ID.txt test.txt 

O acima salva o primeiro campo de ID.txt na matriz a . NR e FNR são% especiaisawk variáveis que significam "a linha atual do fluxo de entrada" e "a linha atual do arquivo atual". Os dois serão apenas iguais entre si quando o primeiro arquivo estiver sendo lido. Portanto, NR==FNR{a[$1]++; next} será executado apenas nas linhas do primeiro arquivo. A segunda parte não será executada porque o next informa awk para pular para a próxima linha.

A segunda parte, verifica se o primeiro campo da linha atual (lembre-se, isso é executado somente no segundo arquivo) existe na matriz a (o que significa que estava em ID.txt ) e, se existir, imprime a linha em um arquivo chamado "field1.txt"

    
por terdon 21.10.2015 / 15:27