bash / awk内部删除

时间:2013-03-26 13:51:30

标签: bash csv awk

我需要一些关于这个bash系列的建议/帮助,我试图用awk完成,

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

"abc,abd,abf,abz,abz"

使用简单的awk循环轻松获取每个字段

echo ${var} | awk -F"," '{for(i=1;i<=NF;i++){print $i}}'

问题是有时这些逗号分隔的值包含一个字符串,中间有逗号,例如:

"abc,"abd,abf,abz",abh,abr,alk"

在这种情况下,“abd,abf,abz”是单个值,我需要告诉awk,引号之间的什么必须被视为整个值而不是分开但我无处可去, 有什么建议吗?

4 个答案:

答案 0 :(得分:1)

我能用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

这确实给出了空行:(,我仍在试图找出原因。

更新:固定+缩进

答案 1 :(得分:1)

首先,您不需要为第一个示例循环:

$ awk '{print}' RS=',' <<< 'abc,abd,abf,abz,abz'
abc
abd
abf
abz
abz

对于第二个例子,你真的想要一个合适的CSV解析器。这是一个python解决方案:

#!/usr/bin/env python
from csv import reader, writer
from sys import stdin, stdout
writer(stdout, delimiter='\n').writerows(reader(stdin))

演示:

$ cat file
abc,"abd,abf,abz",abh,abr,alk

$ csv_delimiter.py < file 
abc
abd,abf,abz
abh
abr
alk

答案 2 :(得分:1)

如果您在示例输入中显示的第一个/最后一个双引号实际上不在您的输入中,那么:

$ 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

答案 3 :(得分:0)

查看允许您操作CSV文件的csvtool程序。

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