使用 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)
我正在尝试使用 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)