3

好的,我有一个 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

4 回答 4

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
于 2013-05-28T14:47:09.647 回答
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

添加

如果您想将awk脚本放入文件中,您可以尝试(我无法测试,抱歉)。

测试.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
于 2013-05-28T14:50:50.530 回答
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
于 2013-05-28T15:06:30.680 回答
0
awk '{ output=$3".csv"; if( !($0 in a)) print "header" > output; a[$0]
    print > output}' FS=, test.csv
于 2013-05-28T14:43:00.713 回答