【问题标题】:Awk using index with Substring使用带有子字符串的索引的 awk
【发布时间】:2014-08-25 19:11:06
【问题描述】:

我有一个命令可以剪切字符串。

我想知道Linux“awk”中命令控制索引的详细信息

我有两种不同的情况。

我想在下面的示例字符串中获取单词“Test”。

1. "Test-01-02-03"    
2. "01-02-03-Test-Ref1-Ref2

我能得到的第一个喜欢

substr('Test-01-02-03',0,index('Test-01-02-03',"-"))
-> Then it will bring result only "test"

第二种情况怎么样,我不确定在这种情况下如何使用索引函数进行测试。

你对使用 awk 有什么想法吗?

谢谢!

【问题讨论】:

  • 你知道“test”这个词会在破折号分隔的字符串中的什么位置出现吗?
  • 您是否一直在寻找特定的词(例如“Test”)?只是-(或单词开头或结尾)之间的那组特定字符?
  • @glennjackman 是的,规则是一样的~每次。相同的位置,但可能是不同的单词(不仅是测试),但每次的位置都是相同的!
  • @EtanReisner 的话应该改变,但位置是一样的
  • 所以您正在寻找字符串中给定位置的字段? -分割字段在哪里?

标签: linux bash shell awk


【解决方案1】:

这是使用 index() 查找/打印子字符串的方法:

$ cat file
Test-01-02-03
01-02-03-Test-Ref1-Ref2

$ awk -v tgt="Test" 's=index($0,tgt){print substr($0,s,length(tgt))}' file
Test
Test

但这可能不是解决您的实际问题的最佳解决方案。

为了比较,这里是如何使用 match() 对 RE 进行等效操作:

$ awk -v tgt="Test" 'match($0,tgt){print substr($0,RSTART,RLENGTH)}' file
Test
Test

如果你喜欢match() 的概要,下面是如何编写你自己的函数来处理字符串:

awk -v tgt="Test" '
function strmatch(source,target) {
    SSTART  = index(source,target)
    SLENGTH = length(target)
    return SSTART
}

strmatch($0,tgt){print substr($0,SSTART,SLENGTH)}
' file

【讨论】:

    【解决方案2】:

    如果这些行是awk 的直接输入,那么以下工作:

    • echo 'Test-01-02-03' | awk -F- '{print $1}'#第一个字段
    • echo '01-02-03-Test-Ref1-Ref2' | awk -F- '{print $NF-2}' # 倒数第三个字段。

    如果这些行从 awk 脚本中的较大行中拉出并需要再次拆分,则以下 sn-ps 将执行此操作:

    • str="Test-01-02-03"; split(str, a, /-/); print a[1]
    • str="01-02-03-Test-Ref1-Ref2"; numfields=split(str, a, /-/); print a[numfields-2]

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 2023-03-31
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多