使用 awk header 将 csv 拆分为多个文件

Splitting csv into multiple files with header using awk

我正在尝试使用 awk 将基于唯一列值的 csv 文件拆分为多个文件。我能够使用 awk -F\, '{print > ".csv"}' example.csv 成功拆分 csv,但是它正在提交新文件中的 header 列。

例如:

example.csv

Color,Car,Make
Red,Kia,Spectra
Orange,Kia,Sportage
Green,Ford,Explorer
Black,Ford,F-150

结果:

Kia.csv

Red,Kia,Spectra
Orange,Kia,Sportage
___________________
Ford.csv

Green,Ford,Explorer
Black,Ford,F-150

我想要的输出:

Kia.csv

Color,Car,Make
Red,Kia,Spectra
Orange,Kia,Sportage
___________________
Ford.csv

Color,Car,Make
Green,Ford,Explorer
Black,Ford,F-150

为了尝试将 header 列传递给新文件,我尝试了类似这样的操作 awk -F'|' 'FNR==1{hdr=[=15=];next} {if (!seen[]++) print hdr>; print>}' example.csv 但不幸的是,这没有达到预期的结果。

你快到了。你能试试吗:

awk -F, '
    FNR==1 {header = [=10=]; next}
    !seen[]++ {print header > ".csv"}
    {print > ".csv"}
' example.csv

如果您的汽车品牌种类繁多,可能会出现“打开文件过多错误”。在这种情况下,请关闭参考@RavinderSingh13 答案的文件。

第一个解决方案:使用您显示的示例,请尝试遵循 awk 代码。

awk -F, '
FNR==NR{
  header=[=10=]
  next
}
{
  outputFile=".csv"
}
prev!=".csv" || !prev{
  close(prev)
  print header > (outputFile)
}
{
  print [=10=] > (outputFile)
  prev=outputFile
}
' <(head -1 Input_file) <(tail -n +2 Input_file | sort -t, -k2)


第二个解决方案: 添加解决方案,仅读取 1 遍 Input_file.

awk -F, -v header=$(head -1 Input_file) '
{
  outputFile=".csv"
}
prev!=".csv" || !prev{
  close(prev)
  print header > (outputFile)
}
{
  print [=11=] > (outputFile)
  prev=outputFile
}
' <(tail -n +2 Input_file | sort -t, -k2)