bash/awk内部删除
我需要一些关于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能做的最好
"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