awk 与正则表达式作为分隔符

awk 与正则表达式作为分隔符

我想从文件中获取每一行的第一个单词。不幸的是,很多行都以空格开头。所以我尝试用以下内容来获取第一个词:

awk -F'[ \t]+' '{print $1}' < MyFile.txt,但它不起作用。我尝试这个echo " some string: here" | awk -F'[ \t]+' '{print $1}',结果是空行(我认为它打印空字符串)。那么为什么这不起作用呢?我想让它与 awk 命令一起使用并显式传递分隔符(出于教育目的)

提前致谢。

答案1

您为 Awk 指定至少由空格或制表符组成的字段分隔符。

您将字符串some string: here输入 Awk 并要求它打印第一个字段。

您不会得到任何输出,因为第一个字段为空。

该字符串中的字段是

<1:>   <2:some> <3:string:> <4:here>
$ echo '   some string: here' | gawk 'BEGIN {OFS="|";FS="[ \t]+"}{print $1,$2,$3,$4}'
|some|string:|here

使用逗号分隔的输入数据更明显,例如

,some,string:,here

如果您避免指定分隔符,Awk 将使用任何连续空格和/或制表符作为分隔符。此外,该行两侧的任何此类空白字符都将不是将行拆分为字段时要考虑。


如果您的输入是 JSON 或 YAML,请考虑使用适合解析这些结构化文档格式的工具,而不是使用 Awk。对于此类工具的建议包括jqyqmlrjtc其他。

答案2

在 awk 中,默认的字段分隔符-F " "BEGIN{FS=" "}遵循特殊约定

  • (1) 忽略初始空格和最终空格
  • (2) 分割[ \t]+

第 (1) 点——忽略首尾空格——仅当字段分隔符恰好为 " "

这种行为实际上是我们所期望的。

默认awk '{print $1}'工作 find 也是如此awk -F' ' '{print $1}'


输入记录分隔符(RS)还有另一个类似的约定:当RS="" 它代表段落分隔时:

  • (1) 分隔符为一个或多个空行
  • (2) 忽略初始和最后的空行。

第(2)点——忽略开头/结尾的空行——仅当输入记录分隔符恰好为“”时应用

答案3

awk分配字段时忽略前导空格,默认命令是 print。所以这应该可以正常工作:

awk '{print $1}'

相关内容