使用AWK从文件名字段中删除引号

使用AWK从文件名字段中删除引号,awk,Awk,我已经花了一个小时来研究这个问题,试图找出如何使用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]

我已经花了一个小时来研究这个问题,试图找出如何使用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,但是我需要在$2上进行某种转换,然后才能将其转换为evname)。在实际文件中,我希望保留封装的引号

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美元,我不确定这是否意味着我需要在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
非常感谢您的帮助

提前谢谢


甘农

如果我正确理解您的尝试,那么

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
}
或者替换后的任何其他格式(这似乎是您在第二个代码段中尝试获得的格式)


gsub
函数返回所做替换的次数,而不是替换的结果;这就是为什么
evname=gsub(“\”,“,$2)”-事件ID[“$1”].csv“
不起作用。

如果我正确理解您的尝试,那么

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
}
或者替换后的任何其他格式(这似乎是您在第二个代码段中尝试获得的格式)


gsub
函数返回所做替换的数量,而不是替换的结果;这就是为什么
evname=gsub(“\”,“,$2)”-事件ID[“$1”].csv“
不起作用。

在进行分配之前应用gsub:

awk -F, 'NR==1{h=$0;next}
    !($1 in files){
    gsub("\"","",$2);  # Add this line
    evname=$2" ["$1"].csv";files[$1]=1;print...

在进行分配之前应用gsub:

awk -F, 'NR==1{h=$0;next}
    !($1 in files){
    gsub("\"","",$2);  # Add this line
    evname=$2" ["$1"].csv";files[$1]=1;print...

只要有一点空白,事情就会变得更清楚:

awk -F, '
    NR==1 { hdr=$0; next }
    !seen[$1]++ {
        evname = $2
        gsub(/"/,"",evname)
        outfile = evname " [" $1 "].csv"
        print hdr > outfile
    }
    { print > outfile }
' DataExtract.csv
旁白:考虑到以后编写的脚本处理文件的复杂性,有些人希望创建名称中带有空格的文件是非常罕见的。你确定要这样做吗

另外,下面是@JID建议的呆板版本

awk -F, '
    NR==1 { hdr=$0; next }
    !seen[$1]++ {
        outfile = gensub(/"/,"","g",$2) " [" $1 "].csv"
        print hdr > outfile
    }
    { print > outfile }
' DataExtract.csv

只要有一点空白,事情就会变得更清楚:

awk -F, '
    NR==1 { hdr=$0; next }
    !seen[$1]++ {
        evname = $2
        gsub(/"/,"",evname)
        outfile = evname " [" $1 "].csv"
        print hdr > outfile
    }
    { print > outfile }
' DataExtract.csv
旁白:考虑到以后编写的脚本处理文件的复杂性,有些人希望创建名称中带有空格的文件是非常罕见的。你确定要这样做吗

另外,下面是@JID建议的呆板版本

awk -F, '
    NR==1 { hdr=$0; next }
    !seen[$1]++ {
        outfile = gensub(/"/,"","g",$2) " [" $1 "].csv"
        print hdr > outfile
    }
    { print > outfile }
' DataExtract.csv

你的产出应该是什么样子还不是很清楚。你能澄清一下吗?你的产出应该是什么样子还不是很清楚。你能澄清一下吗?啊,我以为gsub忽略了我想要2美元的事实,只是给了我2美元,但我不认为是因为有两种替代品。这非常接近我需要的……o唯一的问题是文件的内容从$2中删除了封装,并且第一行值(在打印h之后)也删除了所有逗号。数据行2-n(即文件行3-n)看起来正确(封装并用逗号分隔)。有没有办法只删除文件名中使用的引号,而不删除打印到相关文件的引号?
tmp=$2;gsub(/“/,”,tmp);evname=tmp“-Event ID[“$2”].csv”
——只需复制一份
$2
,然后使用它。实际上,让我在答案中更改一下,这确实是一个bug。[拍额头!]这很有道理-谢谢Wintermute!!你是对的,这正是我想要实现的(对不起,第二个声明有点不同,我试图简化以解决问题,但你发现了这两个-非常感谢!啊,我认为gsub不知何故忽视了我想要2美元的事实,只是给了我2美元,我不认为这是因为有两个替代品。这非常接近我所需要的……等等唯一的问题是,文件的内容从$2中删除了封装,并且第一行值(在打印h之后)也删除了所有逗号。数据行2-n(即文件行3-n)看起来正确(封装并用逗号分隔)。有没有办法只删除文件名中使用的引号,而不删除打印到相关文件的引号?
tmp=$2;gsub(/“/,”,tmp);evname=tmp“-Event ID[“$2”].csv”
——只需复制一份
$2
,然后使用它。实际上,让我在答案中更改一下,这确实是一个bug。[拍额头!]这很有道理-谢谢Wintermute!!你是对的,这正是我想要实现的(对不起,第二种说法有点不同,我试图简化以解决这个问题,但你发现了这两种情况-非常感谢!你能不能不使用gensub而不是创建一个新变量?是的,但这会使它特定于gawk,当可移植awk如此微不足道时,我通常不会为了一个变量而这样做。好吗:)。这是OP的原始代码,看起来他们试图像使用gensub一样使用gsub。实际上,这样做可能更好:)最后我添加了一个gawk版本,谢谢你的建议。你能不能用gensub来代替创建一个新的变量?是的,但这会使它特定于gawk,我通常不会在便携awk非常简单的情况下为了一个变量而这样做。好的:)。这只是来自OP的原始代码。看起来他们试图像使用gensub一样使用gsub。实际上,这样做可能更好:)我在最后添加了一个呆滞的版本,谢谢你的建议。