awk CSV拆分标题Windows

时间:2013-05-28 14:36:28

标签: csv awk

好的我有一个csv文件,我需要根据列值进行拆分,但是我无法在每个文件中打印标题。

目前我使用:

awk "FS =\",\" {output=$3\".csv\"; print $0 > output}" test.csv

根据第3列拆分文件文件,但我不知道如何将标头添加到每个文件中。

我搜索过高和低低但无法找到可以在一个班轮中工作的解决方案...

更新

好的,到目前为止,我们有一个工作单位:

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可以从另一个文件中删除参考编号,或者我使用错误的工具进行工作?

再次感谢。

4 个答案:

答案 0 :(得分:1)

awk -F, 'NR==1{h=$0;next}{out=$3".csv";
    if!(out in a)print h> out; print $0 > out;a[out]}' test.csv

答案 1 :(得分:1)

<强>已更新#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

或添加肯特的想法:

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.csvhdr。对于下一行,它检查文件名值是否已存在。如果没有,则将其名称存储在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

<强> ADDED

如果您想将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

答案 2 :(得分:1)

尝试这样的事情:

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

答案 3 :(得分:0)

awk '{ output=$3".csv"; if( !($0 in a)) print "header" > output; a[$0]
    print > output}' FS=, test.csv