Uma coluna em dois

2

Eu tenho um arquivo que é uma coluna e preciso dividi-lo em dois. Eu tentei o comando column e parece não funcionar:

123-zyx
234-yxw
345-xwv
456-wvu
567-vut
678-uts
    
por Tanner Di Bella 31.07.2015 / 04:17

5 respostas

5

Você pode simplesmente usar o utilitário tr :

tr '-' $' ' < filename

Saída:

123 zyx
234 yxw
345 xwv
456 wvu
567 vut
678 uts

Você pode sed assim:

sed 's/-/ /g' < filename

Saída:

123 zyx
234 yxw
345 xwv
456 wvu
567 vut
678 uts
    
por 31.07.2015 / 09:03
1

Você pode usar a opção -s :

column -s- -t file
    
por 31.07.2015 / 04:24
1

Se os dados de entrada de amostra mostrados estiverem localizados em um arquivo chamado ./in , então ...

<in >out tr -- - \t

... você obteria duas colunas separadas < tab > em um arquivo chamado ./out .

No entanto, dependendo do seu tr , talvez seja necessário usar um caractere literal < tab > no lugar dos dois últimos caracteres. De fato, você deve se sentir livre para substituir os dois últimos por qualquer outro delimitador que você queira.

    
por 31.07.2015 / 04:33
1

awk solution:

awk 'BEGIN{FS="-"} ; { print $1,$2 }' file
    
por 31.07.2015 / 09:46
0

Apenas para o Bash:

# VERSION 1

while IFS=$'-' read -a line
do
    printf '%s %s\n' ${line[@]}
done < infile > outfile

ou ...

# VERSION 2

main(){ 
  local IFS=$'-\n'
  local a=( $(<infile) )
  printf '%s %s\n' ${a[@]} > outfile
}

main

ou ...

# VERSION 3

while IFS= read -r line
do
  printf '%s\n' "${line/-/ }"
done < infile > outfile

Mas cuidado: veja esta postagem se estiver pensando em aplicar isso em arquivos grandes.

Por diversão, alguns benchmarks em um arquivo de tamanho moderado. Os resultados seguem; 'tr' é claramente a melhor escolha, seguida por sed e depois awk. O melhor Bash é a versão 2 (625 vezes mais lenta que tr e uso de memória 82 vezes maior). Por comparação, o sed é 7,5 vezes mais lento e o awk é 9 vezes mais lento que o tr.

$ stat -c %s bigdata.txt && wc -l bigdata.txt
1439952
179994 bigdata.txt

# tr '-' $' ' < "$1" > tr.txt

CPU TIME AND RESOURCE USAGE OF './tr bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :    0.02
CPU, pct :   97.10
RAM, kb  : 1390.00

# sed 's/-/ /g' < "$1" > sed.txt

CPU TIME AND RESOURCE USAGE OF './sed bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :    0.15
CPU, pct :   98.90
RAM, kb  : 1386.80

# awk 'BEGIN{FS="-"} ; { print $1,$2 }' "$1" > awk.txt

CPU TIME AND RESOURCE USAGE OF './awk bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :    0.18
CPU, pct :   98.80
RAM, kb  : 1402.00

# BASH: VERSION 1

CPU TIME AND RESOURCE USAGE OF './bash_1 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :   16.35
CPU, pct :   99.00
RAM, kb  : 1486.40

# BASH: VERSION 2

CPU TIME AND RESOURCE USAGE OF './bash_2 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :   12.51
CPU, pct :   99.40
RAM, kb  : 114002.40

# BASH: VERSION 3

CPU TIME AND RESOURCE USAGE OF './bash_3 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS

CPU, sec :   15.45
CPU, pct :   99.00
RAM, kb  : 1484.00
    
por 17.10.2015 / 09:45