Tenho um arquivo CSV (cerca de 10.000 linhas; cada linha com 300 colunas) armazenado no servidor LINUX. Quero dividir esse arquivo CSV em 500 arquivos CSV de 20 registros cada. (Cada um com o mesmo cabeçalho CSV presente no CSV original)
Existe algum comando do Linux para ajudar nesta conversão?
Responder1
Para completar, aqui estão algumas pequenas melhorias:
- Você poderia salvar o cabeçalhouma veze reutilizar muitas vezes
- Você pode inserir o cabeçalho nos arquivos divididos
sed
sem arquivos temporários
Assim:
header=$(head -n 1 file.csv)
tail -n +2 file.csv | split -l 20
for file in x??; do
sed -i -e 1i$'\\\n'"$header" "$file"
done
Existe $'\\\n'
um caractere NEWLINE escapado com uma barra invertida. A sed
expressão significa: inserir $header
antes da 1ª linha.
Responder2
Isso deve servirsemo cabeçalho CSV:
tail -n +2 file.csv | split -l 20
Você pode então adicionar o cabeçalho a cada um dos arquivos:
for file in x*
do
(head -n 1 file.csv; cat "$file") > "$file".new
mv "$file".new "$file" # Stolen from @PawanMude's answer
done
Responder3
Tentar:
fn="infile" c=0
{
read header
split -a 3 -l 3 - "$fn"
for f in "$fn"???; do
c=$((c+1))
printf "%s\n" "$header" | cat - "$f" > "${f%???}-$c" && rm "$f"
done
} < $fn
Ou tente com awk:
awk 'NR==1{h=$0; next} !((NR-2)%n){close(f); f=FILENAME "-" ++c; print h>f}{print>f}' n=3 infile
versão multilinha:
awk '
NR==1 {
h=$0
next
}
!((NR-2)%n) {
close(f)
f=FILENAME "-" ++c
print h>f
}
{
print>f
}
' n=3 infile
Responder4
Use GNU Paralelo:
cat bigfile.csv | parallel -N20 --header : --pipe 'cat > {#}'
Se você precisar executar um comando em cada uma das partes, o GNU Parallel também poderá ajudar:
cat bigfile.csv | parallel -N20 --header : --pipe my_program_reading_from_stdin
cat bigfile.csv | parallel -N20 --header : --pipe --cat my_program_reading_from_a_file {}