Как я могу использовать что-то вроде того, sed
чтобы разделить файл на два, так чтобы файл, содержащий
eric shwartz
david snyder
где 4 пробела между записями на самом деле являются символами табуляции в двух файлах, например:
file1
:
eric
david
file2
:
shwartz
snyder
Поэтому он помещает все, что находится после табуляции в каждой строке, в другой файл.
решение1
Решением может быть:
awk '{ print $1 > "file1"; print $2 > "file2"}' file
решение2
Обязательно ли это должен быть один сценарий? Если нет, то можно сделать так:
cut -f 1 file > file1
cut -f 2 file > file2
cut
выбирает столбец (по умолчанию разделенный табуляцией). -f — это флаг, который принимает число в качестве аргумента, и это число является номером столбца.
решение3
Я не думаю, что может быть что-то проще, чемawk
подход,Итак, вот решение на Perl, которое работает для любого количества столбцов, сохраняя каждый в отдельном файле:
perl -ane 'unless($handles[0]){
for(1..$#F+1){
open(my $fh, ">","file$_");
$handles[$_-1] = $fh
}
}
for my $i (0..$#F){
print { $handles[$i] } "$F[$i]\n"
}' file
Имеем такой входной файл:
$ cat file
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad
foo bar baz bad
Приведенный выше скрипт создаст файлы, file1
каждый file4
из которых будет содержать соответствующий столбец.
Конечно, вы можете сделать то же самое в awk
, гораздо проще и элегантнее, но в чем тут веселье?
awk '{for(i=1;i<=NF;i++){print $i > "file"i}}' file
решение4
moreutils (доступно во многих репозиториях дистрибутивов илиhttp://joeyh.name/code/moreutils/) имеет несколько полезных утилит, одна из которых поможет здесь:
pee 'cut -f1 >file1' 'cut -f2 >file2' < file