如何按照指定的行数拆分CSV文件?


2

我已经将CSV文件(大约10,000行;每行具有300列)存储在LINUX服务器上。我想将此CSV文件分解为500个CSV文件,每个文件20条记录。(每个具有与原始CSV中相同的CSV标头)

有什么linux命令可以帮助这种转换吗?

Answers:


2

为了完整性,这里有一些小的改进:

  • 您可以保存标头一次,然后重复使用多次
  • 您可以在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'有一个换行符用反斜杠转义。该sed表达式的意思是:$header在第一行之前插入。


1

这应该在没有 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

1

尝试:

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

0

下文提到的使用POST解决此问题的最佳方法:

    tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
    head -n 1 file.txt > tmp_file
    cat $file >> tmp_file
    mv -f tmp_file $file
done

0

使用GNU并行:

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 {}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.