awk CSV Split with headers Windows



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

最新更新