Como dividir a saída em arquivos diferentes?

1

Eu tenho um arquivo de entrada como

 foo xxx yyy zzz
 foo xxx yyy zzz
 foo xxx yyy zzz
 foo xxx yyy zzz
 bar xxx yyy zzz
 bar xxx yyy zzz
 foo xxx yyy zzz
 ..

Como dividir o arquivo de entrada por linha em foo.txt e bar.txt , dependendo da existência de foo e bar no início da linha?

    
por Ryan 13.06.2014 / 07:40

5 respostas

4

grep -E '^foo' input.txt > foo.txt
grep -E '^bar' input.txt > bar.txt

mbp-000234: ~ dmourati $ cat foo.txt

foo xxx yyy zzz
foo xxx yyy zzz
foo xxx yyy zzz
foo xxx yyy zzz
foo xxx yyy zzz

mbp-000234: ~ dmourati $ cat bar.txt

bar xxx yyy zzz
bar xxx yyy zzz
    
por 13.06.2014 / 08:03
1
grep ^foo input.txt > foo.txt
grep ^bar input.txt > bar.txt

^ garantirá que você corresponde apenas ao início da linha, para que funcione mesmo se o restante da linha se parecer com:

foo xxx yyy zzz bar
    
por 13.06.2014 / 08:05
1
awk '{ f = $1 ".txt"; print > f }' file
    
por 13.06.2014 / 13:37
1

Tente este código e faça quaisquer alterações, se necessário, uma vez que não tentei executá-lo.

awk '
    BEGIN { foo="foo.txt"; bar="bar.txt" }
    {if ($1 == "foo")
         $0 >> foo;
     else
             $0 >> bar;
    }' sourcefilename
    
por 13.06.2014 / 08:04
0

Você também pode distribuir o fluxo de arquivos com tee e, em seguida, dividir em paralelo:

<file tee >(grep '^foo' > foo.txt) >(grep '^bar' > bar.txt) > /dev/null

Resultado:

$ tail -n+1 foo.txt bar.txt
==> foo.txt <==
foo xxx yyy zzz
foo xxx yyy zzz
foo xxx yyy zzz
foo xxx yyy zzz
foo xxx yyy zzz

==> bar.txt <==
bar xxx yyy zzz
bar xxx yyy zzz
    
por 13.06.2014 / 14:39