bash/awk内部删除

bash/awk内部删除,bash,csv,awk,Bash,Csv,Awk,我需要一些关于bash的建议/帮助,我正试图用awk来完成这个任务 基本上,我有一个包含逗号分隔值的变量,如下所示: "abc,abd,abf,abz,abz" 通过一个简单的awk循环很容易获得每个字段 echo ${var} | awk -F"," '{for(i=1;i<=NF;i++){print $i}}' 在这种情况下,“abd,abf,abz”是一个单一的值,我需要告诉awk,引号之间的内容必须被视为整个值,不能分开,但我什么也得不到, 有什么建议吗?我对awk能做的最好

我需要一些关于bash的建议/帮助,我正试图用awk来完成这个任务

基本上,我有一个包含逗号分隔值的变量,如下所示:

"abc,abd,abf,abz,abz"
通过一个简单的awk循环很容易获得每个字段

echo ${var} | awk -F"," '{for(i=1;i<=NF;i++){print $i}}'
在这种情况下,“abd,abf,abz”是一个单一的值,我需要告诉awk,引号之间的内容必须被视为整个值,不能分开,但我什么也得不到,
有什么建议吗?

我对awk能做的最好的建议是:

$ echo 'abc,"xxx,yyy,zzz",abh,abr,alk' | awk -F'"' '{
    for(i=1;i<=NF;i++) {
      if (i %2 == 0) {
        printf "\""$i"\"";
      } else {
        n=split($i,array,",");
        for (j=1; j<n; j++) {
          print array[j];
        }
      }
    }
  }'
abc
"xxx,yyy,zzz"
abh
abr
alk
$echo'abc,“xxx,yyy,zzz”,abh,abr,alk'| awk-F''{

对于(i=1;i首先,对于第一个示例,您根本不需要循环:


$awk'{print}'RS=','如果示例输入中显示的第一个/最后一个双引号实际上不存在于输入中,则:

$ echo 'abc,"abd,abf,abz",abh,abr,alk' |
awk -F\" '{
    for (i=1;i<=NF;i++) {
        if (i%2) {
            gsub(/^,|,$/,"",$i)
            nf = split($i,a,/,/)
            for (j=1; j<=nf; j++) {
                print a[j]
            }
        }
        else {
            print $i
        }
    }
}'
abc
abd,abf,abz
abh
abr
alk
$echo'abc,“abd,abf,abz”,abh,abr,alk'|
awk-F\“'{

对于(i=1;i请查看允许您操作CSV文件的
csvtool
程序


它可以与apt get一起安装(或与您的包管理器一起安装)并且在Bash文件中用于处理CSV文件。

变量是否总是在同一列中?不,不幸的是不是,因为
awk
假设每次出现字段分隔符时都会将两个字段分隔开,因此它不太适合解析引用字段分隔符不被视为分隔符的文件。请使用用于处理文件的CSV解析器;这样的解析器已经知道如何正确处理带引号的字段分隔符。您的文本是否真的
“abc,…,alk”
或者它是
abc,…,alk
?换句话说,你的字符串中是否存在首个和最后一个双引号字符,或者你在上面添加它们是为了向我们表明它是一个字符串?这与我问的问题无关。我问的是你发布的示例中的第一个和最后一个双引号-这些双引号是吗实际上存在于您的输入中,或者您正在将其添加到此帖子中?哦,见鬼,我刚刚发布了两种情况的答案。+1表示接近。您得到的空行是因为双引号前/后的“,”以及字段的开始/结束处。此外,如果I%2为真,则需要使用split(),如果I%2为假,则不需要使用split()。
$ echo 'abc,"abd,abf,abz",abh,abr,alk' |
awk -F\" '{
    for (i=1;i<=NF;i++) {
        if (i%2) {
            gsub(/^,|,$/,"",$i)
            nf = split($i,a,/,/)
            for (j=1; j<=nf; j++) {
                print a[j]
            }
        }
        else {
            print $i
        }
    }
}'
abc
abd,abf,abz
abh
abr
alk
$ echo '"abc,"abd,abf,abz",abh,abr,alk"' |
awk -F\" '{
    for (i=2;i<NF;i++) {
        if ( !(i%2) ) {
            gsub(/^,|,$/,"",$i)
            nf = split($i,a,/,/)
            for (j=1; j<=nf; j++) {
                print a[j]
            }
        }
        else {
            print $i
        }
    }
}'
abc
abd,abf,abz
abh
abr
alk