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

时间:2015-02-19 11:52:11

标签: 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].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

非常感谢任何帮助。

提前致谢!!

甘农

3 个答案:

答案 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...