Uma solução pode ser:
awk '{ print $1 > "file1"; print $2 > "file2"}' file
Como eu poderia usar algo como sed
para dividir um arquivo em dois para que o arquivo contenha
eric shwartz
david snyder
onde os 4 espaços entre as entradas são realmente tabulados em dois arquivos, como:
file1
:
eric
david
file2
:
shwartz
snyder
Por isso, coloca tudo após a guia em cada linha em outro arquivo.
Tem que ser um script? Se não, você poderia fazer isso:
cut -f 1 file > file1
cut -f 2 file > file2
cut
seleciona uma coluna (por padrão, separada por tabulação). -f é um sinalizador que recebe um número como argumento e esse número é um número de colunas.
Não acho que seja mais simples do que a awk
abordagem, então aqui está um Perl solução que funciona para qualquer número de colunas, salvando cada um em seu próprio arquivo:
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
Dado um arquivo de entrada como este:
$ 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
O script acima criará os arquivos file1
a file4
, cada um contendo a coluna relevante.
Claro, você pode fazer exatamente a mesma coisa em awk
, muito mais simples e elegante, mas onde está a graça nisso?
awk '{for(i=1;i<=NF;i++){print $i > "file"i}}' file
Embora um pouco mais longo e mais complicado, aqui está uma solução usando sed
. (Pode haver uma maneira melhor, mas é assim que eu sei fazer isso.)
sed -e 'h;s/\([^ ]\)\ .*//;w file1' -e 'x;s/.*\ \([^ ]\)//;w file2' file.txt
Explicação
h
Salve a linha no buffer de espera
s/\([^ ]\)\ .*//
Apaga tudo depois do espaço em branco.
w out1
escreve buffer para o arquivo chamado file1
Eu tive que começar uma nova expressão porque o comando w
tomaria TUDO depois dele como o nome do arquivo para escrever, sorte para mim o buffer de retenção ainda está intacto entre as expressões.
x
Troque o buffer de retenção em nosso buffer de trabalho
s/.*\ \(.*\)//
Obtenha tudo após o primeiro espaço em branco
w out2
grava o buffer em um arquivo chamado file2
moreutils (disponível em muitos distro repos, ou link ) tem alguns utilitários úteis, um dos quais ajuda aqui:
pee 'cut -f1 >file1' 'cut -f2 >file2' < file
Tags text-processing awk sed