如何通过awk从本文中获取每一列?

如何通过awk从本文中获取每一列?,awk,Awk,文本文件中的内容: abc [abc d] "abcd e" test abc [abc d] "-" test 基本上,每一列都由空格分隔。但是在某些列的内容中也有一些空格,在这种情况下,整个内容将用[]或“”包装,如上面的示例所示。如何通过awk获得正确的列 正确的列应该是 1:abc 2:[abc d]3:“abcd e”4:测试 1:abc 2:[abc d]3:“-”4:测试 但不是: 1:abc 2:[abc 3:d]4:“abcd 5:e”4:test如果您有GNU awk,您可

文本文件中的内容:

abc [abc d] "abcd e" test
abc [abc d] "-" test
基本上,每一列都由空格分隔。但是在某些列的内容中也有一些空格,在这种情况下,整个内容将用[]或“”包装,如上面的示例所示。如何通过awk获得正确的列

正确的列应该是

1:abc 2:[abc d]3:“abcd e”4:测试

1:abc 2:[abc d]3:“-”4:测试

但不是:


1:abc 2:[abc 3:d]4:“abcd 5:e”4:test

如果您有GNU awk,您可以使用:

本例将以下内容视为一个字段:

  • 由空格分隔的字符串
    [^]+
  • 用方括号括起来的字符串
  • 用双引号括起来的字符串
    “[^\”]+\“

我没有测试如果包含在某个东西中会发生什么,如果包含在其他东西中会发生什么。如果您有GNU awk,请返回报告。

如果您有GNU awk,请搜索FPAT…为您需要的操作添加示例预期输出,以及您试图解决的问题如果输入是
abc“foo[bar”def“oh]no”
abc,列会是什么[foo”bar]“def”]
或类似的?基本上-如果方括号可以出现在双引号内,或者反之亦然,那么将它们包含在示例输入/输出中,并解释如何解决冲突。如果可能出现这种情况,还应在引号字段中包含转义双引号,例如
abc“foo”“bar”def
abc“foo\”bar“def
。中间字符串实际上应该是
[^][/code>,而不是
[^]]
,因为您假定
[
]
都不会出现在
[…]
。我怀疑如果
[
可以出现在带引号的字符串中,这种方法可能会失败,例如
“foo[bar”
,反之亦然。idk如果可以,当然可以。@EdMorton谢谢你。在7周的假期后,我在这些括号中迷失了方向,就像我第一天和Lisp在一起一样。
$ awk '
BEGIN {
    FPAT="([^ ]+)|([[][^][]+[]])|(\"[^\"]+\")"
}
{
    print $3
}' file
"abcd e"
"-"