好的我有一个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可以从另一个文件中删除参考编号,或者我使用错误的工具进行工作?
再次感谢。
答案 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.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
<强> 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
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