我一直在玩这个一个小时试图找出如何使用AWK嵌入从特定字段中删除引号。
基本上,文件将文本封装在引号中,但我想使用第二个字段来命名文件并根据第一个字段将它们拆分。
ID,Name,Value1,Value2,Value3
1,"AAA","DEF",1,2
1,"AAA","GGG",7,9
2,"BBB","DEF",1,2
2,"BBB","DEF",9,0
3,"CCC","AAA",1,1
我想要的是三个文件,所有文件都标题为:
AAA [1].csv
BBB [2].csv
CCC [3].csv
我已经完成了所有工作,除了我不能为我的生活弄清楚如何删除文件名周围的引号!!
所以,这个命令可以完成所有操作(除了文件以$ 2左右的引号命名,但我需要在进入evname之前对$ 2进行某种转换。在实际文件中,我想保留封装引号。
awk -F, 'NR==1{h=$0;next}!($1 in files){evname=$2" ["$1"].csv";files[$1]=1;print h>evname}{print > evname}' DataExtract.csv
我已经尝试将gsub推入其中,但我正在努力弄清楚这应该是什么样的。
这是我认为尽可能接近,但它只是为2美元调用所有“2”,我不确定这是否意味着我需要以某种方式在gsub中进行$ 2的转义,但是尝试了似乎不起作用,所以我对我做错了什么感到茫然。
awk -F, 'NR==1{h=$0;next}!($1 in files){evname=gsub(""\","", $2)" - Event ID ["$1"].csv";files[$1]=1;print h>evname}{print > evname}' DataExtract.csv
非常感谢任何帮助。
提前致谢!!
甘农
答案 0 :(得分:4)
如果我理解你正在尝试的是什么,那么
awk -F, 'NR==1{h=$0;next}!($1 in files){gsub(/"/, "", $2); evname=$2" ["$1"].csv";files[$1]=1;print h>evname}{print > evname}' DataExtract.csv
应该有效。那是
NR == 1 {
h = $0;
next
}
!($1 in files) {
stub = $2 # <-- this is the new bit: make a working copy
# of $2 (so that $2 is unchanged and the line
# is not rebuilt with changes for printing),
gsub(/"/, "", stub) # remove the quotes from it, and
evname = stub " [" $1 "].csv" # use it to assemble the filename.
files[$1] = 1;
print h > evname
}
{
print > evname
}
您当然可以使用
evname = stub " - Event ID [" $1 "].csv"
或替换后的任何其他格式(这似乎是您尝试在第二个代码段中获得的格式)。
gsub
函数返回所做的替换次数,而不是替换的结果;这就是evname=gsub(""\","", $2)" - Event ID ["$1"].csv"
不起作用的原因。
答案 1 :(得分:1)
有一点空白,事情总是更清晰:
awk -F, '
NR==1 { hdr=$0; next }
!seen[$1]++ {
evname = $2
gsub(/"/,"",evname)
outfile = evname " [" $1 "].csv"
print hdr > outfile
}
{ print > outfile }
' DataExtract.csv
除此之外:考虑到您编写处理它们的任何后续脚本中引入的复杂性,有人想要创建名称中带有空格的文件,这是非常不寻常的。你确定要这样做吗?
P.S。这是@JID下面
建议的gawk版本awk -F, '
NR==1 { hdr=$0; next }
!seen[$1]++ {
outfile = gensub(/"/,"","g",$2) " [" $1 "].csv"
print hdr > outfile
}
{ print > outfile }
' DataExtract.csv
答案 2 :(得分:0)
在进行作业之前应用gsub:
awk -F, 'NR==1{h=$0;next}
!($1 in files){
gsub("\"","",$2); # Add this line
evname=$2" ["$1"].csv";files[$1]=1;print...