庆典/ 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的是什么引号之间必须被视为整个价值并没有被分开,但我一事无成, 任何建议?
我可以使用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靠近。由于“,”在双引号之前/之后以及在字段的开始/结尾处,您会变空行。此外,如果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
使用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文件的工作。
是变量总是在同一列? – luk3thomas 2013-03-26 13:54:41
没有,可惜不是, – JBoy 2013-03-26 13:56:19
由于'awk'假定场分离器的每次出现实际分隔两个领域,它不是真的适合解析这里提到的字段分隔符不作这样的处理文件。使用具有CSV解析器的语言来处理您的文件;这样的解析器已经知道如何正确处理引用的字段分隔符。 – chepner 2013-03-26 14:00:28