Dividindo um arquivo e suas linhas no Linux/bash
-
09-06-2019 - |
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?
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)