【问题标题】:Awk substring a single characterawk 子串单个字符
【发布时间】:2014-11-10 04:53:26
【问题描述】:

这里是 columns.txt

aaa bbb 3
ccc ddd 2
eee fff 1
3   3   g
3   hhh i
jjj 3   kkk
ll  3   mm
nn  oo  3

我可以找到第二列以“b”开头的行:

awk '{if(substr($2,1,1)=="b") {print $0}}' columns.txt

我可以找到第二列以“bb”开头的行:

awk '{if(substr($2,1,2)=="bb") {print $0}}' columns.txt

为什么我找不到第二列中第二个字符为“b”的行?:

awk '{if(substr($2,2,2)=="b") {print $0}}' columns.txt 

awk -W version == GNU awk 3.1.8

【问题讨论】:

  • 因为您告诉 substr() 返回 2 个字符(最后一个 arg),然后将生成的 2 字符字符串(例如 bb)与 1 字符字符串 b 进行比较看看它们是否相同,当然它们永远不可能相同。
  • 我一直将此函数用作 substr(field,start,end) ,其中 end 是字符串的第 N 个字符。到目前为止它一直有效,因为我总是从第一个字符开始搜索。

标签: linux bash awk substring gawk


【解决方案1】:

你可以使用:

awk 'substr($2,2,1) == "b"' columns.txt
aaa bbb 3
  1. substr function's 3rd argument 是字符串的长度。
  2. print 是 awk 中的默认操作。

【讨论】:

  • 是的,我的意思只是第三个参数。谢谢@EdMorton。
【解决方案2】:

awk '$2 ~ /^.b/' columns.txt 也可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2015-05-10
    • 2013-04-09
    • 1970-01-01
    • 2021-12-29
    • 2019-11-21
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多