grep uma string awk de um arquivo e grava na outra parte do arquivo de strings

1

Meu arquivo, aaa, tem 5 linhas.

01_AAA-11-ID22
02_BBB-33-ID44
03_CCC-55-ID66
.
.

Eu tentei grep qualquer coisa após o sublinhado de um arquivo bigfile.txt

for i in $(cat aaa)
do
A= $(awk -F '_' '{print $1}' $i)
B= $(awk -F '_' '{print $2}' $i)
grep $B bigfile.txt > $A
done

Eu tentei fazer

grep AAA-11-22 bigfile.txt > 01

Mas parece que não está funcionando. Meu código de erro é

awk: cmd. line: 1: fatal: não é possível abrir o arquivo '01_AAA-11-22' para leitura (nenhum arquivo ou diretório)

Precisa de alguns conselhos. Obrigado,

    
por TJ Wu 14.01.2016 / 21:00

3 respostas

2

echo $i em vez de tentar abri-lo como um arquivo:

for i in $(cat aaa)
do
  A= $(echo $1 | awk -F '_' '{print $1}')
  B= $(echo $i | awk -F '_' '{print $2}')
  grep $B bigfile.txt > $A
done

No entanto, se estiver interessado, você pode substituir esse loop inteiro por um awk one-liner:

awk -F '_' '{system("grep "$2" bigfile.txt > "$1)}' aaa
    
por 14.01.2016 / 21:19
1

Você não precisa usar awk em tudo

while read i
do
    grep ${i#*_} bigfile.txt > ${i%%_*}
done <aaa

Para o GNU sed

sed 's/\([^_]\+\)_\(.*\)/sed "\/\/!d" bigfile.txt >""/e' aaa

Para o awk (se você quiser)

awk -F_ '
    NR == FNR{
        A[$2] = $1
        next
    }
    {
        for(a in A)
            if($0 ~ a)
                print > A[a]
    }
    ' aaa bigfile.txt

Para arquivos grandes, você terá que usar

                print >> A[a]
                close(A[a])
    
por 14.01.2016 / 22:15
0

Você terá que usar echo para passar $i para awk. Caso contrário, procura por um arquivo.

A=$(echo $i | awk -F_ '{print $1}')

Mesmo com B

    
por 14.01.2016 / 21:19