我想从文件中获取每一行的第一个单词。不幸的是,很多行都以空格开头。所以我尝试用以下内容来获取第一个词:
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。对于此类工具的建议包括jq
、yq
、mlr
和jtc
其他。
答案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}'