Bash 带空格的awk打印变量

Bash 带空格的awk打印变量,bash,awk,Bash,Awk,如何将包含空格的变量作为一个变量传递给awk 代码: 预期产出: A=one B=two three C=four 实际产量: A=one B=two C=three 由于分隔符是空格,因此不能有包含空格的字段值 保护与引号也无济于事,因为 AWK不认为它们是保护像CSV解析器那样的列(除非使用EPD建议的FPAT技巧)。< /P> 解决方法:更改字段分隔符: $ echo "$a,$b,$c" | awk -F, '{ print "A="$1 "\nB="$2 "\nC="$3 }' A

如何将包含空格的变量作为一个变量传递给awk

代码:

预期产出:

A=one
B=two three
C=four
实际产量:

A=one
B=two
C=three

由于分隔符是
空格
,因此不能有包含空格的字段值

<>保护与引号也无济于事,因为<代码> AWK<代码>不认为它们是保护像CSV解析器那样的列(除非使用EPD建议的FPAT技巧)。< /P> 解决方法:更改字段分隔符:

$ echo "$a,$b,$c" | awk -F, '{ print "A="$1 "\nB="$2 "\nC="$3 }'
A=one
B=two three
C=four

您可以使用
awk
-v
选项将shell参数传递给
awk

a="one"
b="two three"
c="four"

echo | awk -va="$a" -vb="$b" -vc="$c" '{ print "A="a "\nB="b "\nC="c }'

有一百万个可能的答案,哪一个适合你取决于你想做什么,而你没有告诉我们。以下是将GNU awk用于FPAT的另一种可能性:

$ echo "\"$a\" \"$b\" \"$c\"" | awk -v FPAT='"[^"]+"' '{print "A="$1 "\nB="$2 "\nC="$3 }'
A="one"
B="two three"
C="four"

有趣,当然不是从命令行。但是如果你有一个用引号保护的文件,是的,这是一个很好的特性。考虑到大多数CSV文件只有在需要时才有引号。两种情况都可以吗?另外:在引用的csv文件中,字段本身可能有引号。。。棘手的案例。不确定“当然不是从命令行”是什么意思。是的,CSV文件的FPAT的典型设置,其中一些字段被引用,而一些字段没有被引用,将是
FPAT=”([^,]*)|(“[^”]+”)
,如果要处理转义引号,则可以使用
FPAT=”([^,]*)|(“([^”]|“)*””
,假设字段中的转义引号是通过将引号加倍来完成的,否则请替换
“”
\\“
或任何用于转义引号的内容。从命令行:我的意思是,在逗号更容易的位置添加引号时,您会付出很多努力。但你的方法似乎涵盖了所有情况。我更喜欢python。如果文本中不包含逗号,逗号就更容易了,但无论如何,不需要任何努力,只要输入内容是什么,OP没有告诉我们他真正需要什么。wrt更喜欢python——是的,每个人都有自己的偏好。我自己还没有找到python的用途,我工作的几个平台都没有python,也无法安装它,但我只做了35年的编程,所以我确信对它的需求即将到来:-)。当我在Windows上使用MSYS时遇到太多问题,我就放弃了所有的bash/awk/sed技术。Python解决了所有问题。当我发现这一点时,我才编程24年。所以对你来说,所有的希望都没有失去:)
a="one"
b="two three"
c="four"

echo | awk -va="$a" -vb="$b" -vc="$c" '{ print "A="a "\nB="b "\nC="c }'
$ echo "\"$a\" \"$b\" \"$c\"" | awk -v FPAT='"[^"]+"' '{print "A="$1 "\nB="$2 "\nC="$3 }'
A="one"
B="two three"
C="four"