Ok,我有一个csv文件,我需要根据列值进行拆分,这很好,但我无法在每个文件中打印标题。
目前我使用:
awk "FS ="," {output=$3".csv"; print $0 > output}" test.csv
根据列3拆分文件文件,但我不知道如何为每个文件添加头文件。
I've search high &很低,但找不到一个解决方案,可以在一行中工作…
更新到目前为止,我们有一个工作的一行:
awk -F, "NR==1{hdr=$0;next}!($3 in files){files[$3]=1;print hdr>$3".csv"}{print>$3".csv"}" test.csv
或者test.awk:
BEGIN{FS=","} NR==1 {hdr=$0;next}!($3 in files) {files[$3]=1;print hdr>$3".csv"}{print>$3".csv"}
要运行的命令使用:
awk -f test.awk test.csv
我真的很感谢你的帮助,我已经试了几个小时了,还有一些事情没有解决。
1)页眉后插入空白行2)对指定字段的数据进行排序
在这行后面,我想额外做一个行计数&从另一个文件中剪切一个参考号,AWK是否可以做到这一点,还是我使用了错误的工具?
再次感谢。
已更新#2
标题行后空白行
试试这个:
在Unix/cygwin(我在cygwin上测试):
awk -F, 'NR==1{hdr=$0;next}!($3 in files){files[$3]=1;print hdr"n">$3".csv"}{print>$3".csv"}' test.csv
或者添加Kent的想法:
awk -F, 'NR==1{hdr=$0;next}{out=$3".csv"}!($3 in files){files[$3];print hdr"n">out}{print>out}' test.csv
在windows上cmd(未测试):
awk -F, "NR==1{hdr=$0;next}!($3 in files){files[$3]=1;print hdr"n">$3".csv"}{print>$3".csv"}" test.csv
这将test.csv
的标题行存储到hdr
。对于接下来的行,它检查文件名值是否已经存在。如果没有,则将其名称存储在files
散列中并打印标题行。无论如何,它将整行打印到文件中。
示例文件:
$ cat test.csv
A,B,C,D
1,2,a,3
4,5,b,4
输出$ cat a.csv
A,B,C,D
1,2,a,3
$ cat b.csv
A,B,C,D
4,5,b,4
添加如果你想把awk
脚本到一个文件,你可以尝试(我不能测试是,对不起)。
test.awk
BEGIN{FS=","}
NR==1 {hdr=$0;next}
!($3 in files) {files[$3]=1;print hdr"n">$3".csv"}
{print>"$3.csv"}
那么你可以叫它
awk -f test.awk test.csv
awk -F, 'NR==1{h=$0;next}{out=$3".csv";
if!(out in a)print h> out; print $0 > out;a[out]}' test.csv
试试这样:
awk -F, '
BEGIN {
getline header
}
{
out=$3".csv"
if (!($3 in seen)) {
print header > out
}
print $0 > out
seen[$3]
}' test.csv
Windows版本:(未测试)
awk " FS =","
BEGIN {
getline header
}
{
out=$3".csv"
if (!($3 in seen)) {
print header > out
}
print $0 > out
seen[$3]
}" test.csv
awk '{ output=$3".csv"; if( !($0 in a)) print "header" > output; a[$0]
print > output}' FS=, test.csv