庆典/ AWK内删除

庆典/ AWK内删除

问题描述:

我需要一点点的意见/这个庆典线,我试图用awk完成帮助,庆典/ 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的是什么引号之间必须被视为整个价值并没有被分开,但我一事无成, 任何建议?

+0

是变量总是在同一列? – luk3thomas 2013-03-26 13:54:41

+0

没有,可惜不是, – JBoy 2013-03-26 13:56:19

+3

由于'awk'假定场分离器的每次出现实际分隔两个领域,它不是真的适合解析这里提到的字段分隔符不作这样的处理文件。使用具有CSV解析器的语言来处理您的文件;这样的解析器已经知道如何正确处理引用的字段分隔符。 – chepner 2013-03-26 14:00:28

我可以使用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 

这确实给空行,虽然:(,我仍然试图找出为什么

更新:固定+缩进

+0

+1靠近。由于“,”在双引号之前/之后以及在字段的开始/结尾处,您会变空行。此外,如果i%2为真,则需要使用split(),而不是假如是。 – 2013-03-26 14:51:05

首先,你不需要循环在所有的第一个例子:

$ 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 
+1

使用csv解析器的+1。 – Taoufix 2013-03-26 14:40:52

如果您在您的样品输入显示第一个/最后一个双引号,其实并不存在于你的输入,则:

$ 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 

查看可让您操作CSV文件的csvtool程序。

它可与apt-get安装(或任何你的包管理器),并且在Bash中使用文件使用CSV文件的工作。