获取每行的grep匹配的最后一列

时间:2014-11-10 11:04:13

标签: regex bash awk grep

我们说我有

this is a test string
this is a shest string
this est is another example of sest string

我想要最后一个字符串中的字符编号" t "在单词[tsh] EST中,我该如何获得它?(在bash中) EDIT2:如果我没错,我可以用[tsh] * \ test得到想要的子字符串。

我不能依赖第一场比赛(awk where = match(regex,$ 0))因为它给出了第一个角色位置,但是匹配的大小并不总是相同。

编辑:预期输出 - >

last t of [tsh]*est at char number: 14
last t of [tsh]*est at char number: 15
last t of [tsh]*est at char number: 35

希望我很清楚,我想我编辑了这个问题太多了抱歉!

4 个答案:

答案 0 :(得分:3)

你错了什么

where=match(regex,$0) 

匹配的语法错误。它的字符串后跟正则表达式。那是match($0, regex)

<强>校正

$ awk '{print match($0, "t[^t]*$")}' input
17
18
38

修改

获取最后一个&#34; t&#34;的字符串中的字符数。在单词[tsh] EST,

$ awk '{match($0, "(t|sh|s)est"); print RSTART+RLENGTH-1}' input
14
15
35

OR

更简单的版本

$ awk 'start=match($0, "(t|sh|s)est")-1{$0=start+RLENGTH}1' input
    14
    15
    35

感谢Jidder的建议

编辑

使用正如OP提供的正则表达

$ awk '{for(i=NF; match($i, "(t|sh|s)*est") == 0 && i > 0; i--); print index($0,$i)+RLENGTH-1;}' input
14
15
35

答案 1 :(得分:1)

您可以使用与OP提供的相同正则表达式来使用此awk

awk -v re='[tsh]*est' '{
    i=0;
    s=$0;
    while (p=match(s, re)) {
       p+=RLENGTH;
       i+=p-1;
       s=substr(s, p)
    }
    print i;
}' file
14
15
35

答案 2 :(得分:0)

尝试:

awk '{for (i=NF;i>=0;i--) { if(index ($i, "t") != 0) {print i; break}}}' myfile.txt

答案 3 :(得分:0)

这将打印包含t

的最后一个单词的列
awk '{s=0;for (i=1;i<=NF;i++) if ($i~/t/) s=i;print s}' file
5
5
8

awk '{s=w=0;for (i=1;i<=NF;i++) if ($i~/t/) {s=i;w=$i};print "last t found in word="w,"column="s}'
last t found in word=string column=5
last t found in word=string column=5
last t found in word=string column=8