将某个列的值拆分为单独的文件并包含标题

时间:2015-08-09 21:31:03

标签: bash csv awk

fullfile.csv:

animal,number
rabbit,1
fish,2
mouse,1
dog,1
lizard,2
cat,2

我想将文件拆分为第二列中的值, 并使用此命令:

awk 'BEGIN {FS = ","}; {print > ("file"$2".csv")}' fullfile.csv

输出:

file1.csv

rabbit,1
mouse,1
dog,1

file2.csv

fish,2
lizard,2
cat,2

但是file1.csv或file2.csv中没有标题,所以我试着像这样添加它:

awk 'BEGIN {FS = ","}; NR==1 { print } {print > ("file"$2".csv")}' fullfile.csv

但是标题打印到命令行而不是转到每个文件。如何将标题包含在每个文件中?

2 个答案:

答案 0 :(得分:4)

您还可以使用awkawk -F","脚本之外指定字段分隔符。

您可以在NR==1时将标头存储为变量。将文件编号存储在一个数组中,如果该编号尚未在数组中,则只写入一次标题。一旦值在数组中,您只需在以前设置它们时将行写入各自的文件:

awk -F"," 'NR==1{header=$0}NR>1&&!a[$2]++{print header > ("file"$2".csv")}NR>1{print > ("file"$2".csv")}' fullfile.csv

输出:

file1.csv

animal,number
rabbit,1
mouse,1
dog,1

file2.csv

animal,number
fish,2
lizard,2
cat,2

答案 1 :(得分:0)

这是一个更简单的awk命令,具有更好的格式。

awk -F, '
NR==1 {hdr=$0; next}
{fn="file" $2 ".csv"}
!seen[$2]++{print hdr > fn}
{print > fn}' fullfile.csv

样本输出

$ for i in file*.csv; do echo $i; cat $i; echo; done
file1.csv
animal,number
rabbit,1
mouse,1
dog,1

file2.csv
animal,number
fish,2
lizard,2
cat,2