Pergunta

Eu tenho um arquivo bastante grande (150 milhões de linhas de 10 caracteres).Preciso dividi-lo em 150 arquivos de 2 milhões de linhas, com cada linha de saída sendo alternativamente os primeiros 5 caracteres ou os últimos 5 caracteres da linha de origem.Eu poderia fazer isso em Perl rapidamente, mas queria saber se havia uma solução fácil usando o bash.Alguma ideia?

Foi útil?

Solução

Trabalho de casa?:-)

Eu pensaria que um canal simples com sed (para dividir cada linha em duas) e split (para dividir as coisas em vários arquivos) seria suficiente.

O comando man é seu amigo.


Adicionado após confirmação de que não é lição de casa:

Que tal

sed 's/\(.....\)\(.....\)/\1\n\2/' input_file | split -l 2000000 - out-prefix-

?

Outras dicas

Acho que algo assim poderia funcionar:

out_file=1
out_pairs=0
cat $in_file | while read line; do
    if [ $out_pairs -gt 1000000 ]; then
        out_file=$(($out_file + 1))
        out_pairs=0
    fi
    echo "${line%?????}" >> out${out_file}
    echo "${line#?????}" >> out${out_file}
    out_pairs=$(($out_pairs + 1))
done

Não tenho certeza se é mais simples ou mais eficiente do que usar Perl.

Os primeiros cinco caracteres de cada variante de linha, assumindo que o arquivo grande é chamado x.txt e supondo que não há problema em criar arquivos no diretório atual com nomes x.txt.* :

split -l 2000000 x.txt x.txt.out && (para splitfile em x.txt.out*;faça outfile="${splitfile}.firstfive";echo "$splitfile -> $outfile";cut -c 1-5 "$splitfile" > "$outfile";feito)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top