我需要一些关于这个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,引号之间的什么必须被视为整个值而不是分开但我无处可去, 有什么建议吗?
答案 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文件。