dividindo um arquivo com linhas separadas por guias em dois arquivos

4

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.

    
por jaw2233 27.10.2016 / 15:26

5 respostas

14

Uma solução pode ser:

awk '{ print $1 > "file1"; print $2 > "file2"}' file 
    
por 27.10.2016 / 15:33
10

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.

    
por 27.10.2016 / 15:32
5

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 
    
por 27.10.2016 / 17:30
3

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

    
por 27.10.2016 / 16:12
0

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
    
por 27.10.2016 / 23:33