Назад | Перейти на главную страницу

Как разделить вывод на разные файлы?

У меня есть входной файл вроде

 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
 ..

Как разбить входной файл по строкам, на foo.txt и bar.txt, в зависимости от наличия foo и bar в начале строки?

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

Попробуйте этот код и при необходимости внесите изменения, так как я не пробовал его запускать.

awk '
    BEGIN { foo="foo.txt"; bar="bar.txt" }
    {if ($1 == "foo")
         $0 >> foo;
     else
             $0 >> bar;
    }' sourcefilename
awk '{ f = $1 ".txt"; print > f }' file
grep ^foo input.txt > foo.txt
grep ^bar input.txt > bar.txt

^ обеспечит соответствие только началу строки, поэтому он будет работать, даже если остальная часть строки выглядит так:

foo xxx yyy zzz bar

Вы также можете распространять файловый поток с помощью tee а затем разделить параллельно:

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

Результат:

$ 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