Как разделить CSV-файлы по указанному количеству строк?

Как разделить CSV-файлы по указанному количеству строк?

У меня есть CSV-файл (около 10 000 строк; каждая строка содержит 300 столбцов), хранящийся на сервере LINUX. Я хочу разбить этот CSV-файл на 500 CSV-файлов по 20 записей в каждом. (Каждый из которых имеет тот же заголовок CSV, что и в исходном CSV)

Есть ли какая-нибудь команда Linux, которая поможет выполнить это преобразование?

решение1

Для полноты картины вот несколько незначительных улучшений:

  • Вы можете сохранить заголовокодин рази использовать повторно много раз
  • Вы можете вставить заголовок в разделенные файлы, используя sedбез временных файлов

Так:

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

Символ $'\\\n'NEWLINE экранирован обратной косой чертой. sedВыражение означает: вставить $headerперед 1-й строкой.

решение2

Это должно сработатьбеззаголовок CSV:

tail -n +2 file.csv | split -l 20

Затем вы можете добавить заголовок к каждому из файлов:

for file in x*
do
    (head -n 1 file.csv; cat "$file") > "$file".new
    mv "$file".new "$file" # Stolen from @PawanMude's answer
done

решение3

Пытаться:

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

Или попробуйте с awk:

awk 'NR==1{h=$0; next} !((NR-2)%n){close(f); f=FILENAME "-" ++c; print h>f}{print>f}' n=3 infile

многострочная версия:

awk '
  NR==1 {
    h=$0
    next
  }
  !((NR-2)%n) {
    close(f)
    f=FILENAME "-" ++c
    print h>f
  }
  {
    print>f
  }
' n=3 infile

решение4

Используйте GNU Parallel:

cat bigfile.csv | parallel -N20 --header : --pipe 'cat > {#}'

Если вам необходимо выполнить команду для каждой из частей, то GNU Parallel также может помочь сделать это:

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 {}

Связанный контент