繁体   English   中英

awk 找到第一个匹配项,而不是所有匹配项

[英]awk finds first match, not all matches in line

背景资料:

我正在尝试在文件中搜索模式(字符串)。 我想打印线条和线条中找到图案的位置。

到目前为止,我能够找到我的模式的第一个字母第一次出现。

但我想找到整个模式的所有出现

代码(search.sh):

#!/bin/bash
file=$1
awk -v s="$2" 'i=index($0, s){print "line: " NR, "pos: " i}' "$file"

命令行调用:

$ ./search.sh test.txt GA

测试.txt

1 GAGAGAGAGA
2 CTCTCTCTCT
3 TATATATATA
4 CGCGCGCGCG
5 CCCCCCCCCC
6 GGGGGGGGGG
7 AAAAAAAAAA
8 TTTTTTTTTT
9 TGATTTTTTT
10 CCCCCCCCGA

当我用 test.txt 运行上面的命令行调用时,打印的结果是:

结果:

line: 1 pos: 1
line: 4 pos: 2
line: 6 pos: 1
line: 9 pos: 2
line: 10 pos: 9

这显然只是G的第一场比赛。

有什么办法可以稍微修改我的 awk 命令,还是我在思考一个完全错误的方向?

遵循 awk 可能会对您有所帮助。

cat search.sh
Input_file="$1"
text_to_be_searched="$2"
awk -v var="$text_to_be_searched" '{
while($0){
  match($0,var);
  q=q?q+length(var):RSTART;
  if(RSTART){
    val=val? val "," q:"Line:"NR FS "pos:" q;
    $0=substr($0,RSTART+RLENGTH);
}
  else{
    if(val){
      print val};
    q=val="";
    next
}
};
  print val;
  q=val=""
}
END{
  if(val){
    print val
}}
'   "$Input_file"

./search.sh test.txt GA

输出如下。

Line:1 pos:1,3,5,7,9
Line:9 pos:2
Line:10 pos:9

使用 Grep

测试.txt

GAGAGAGAGA
CTCTCTCTCT
TATATATATA
CGCGCGCGCG
CCCCCCCCCC
GGGGGGGGGG
AAAAAAAAAA
TTTTTTTTTT
TGATTTTTTT
CCCCCCCCGA

搜索.sh

#!/bin/bash
while read -r line; do
    ((++i))
    echo "$line" | grep -bon "$2" | sed -r "s@^([0-9]+):([0-9]+):.*@Line: $i, Position: \2@g"
done < "$1"

输出

darby@Debian:~/Scrivania$ bash search.sh test.txt GA
Line: 1, Position: 0
Line: 1, Position: 2
Line: 1, Position: 4
Line: 1, Position: 6
Line: 1, Position: 8
Line: 9, Position: 1
Line: 10, Position: 8
darby@Debian:~/Scrivania$

笔记

位置索引从零开始。

perl

$ perl -lne 'while(/GA/g){print "line: $. pos: $-[0]"}' ip.txt
line: 1 pos: 0
line: 1 pos: 2
line: 1 pos: 4
line: 1 pos: 6
line: 1 pos: 8
line: 9 pos: 1
line: 10 pos: 8

$ perl -lne 'while(/GA/g){print "line: $. pos: ", $-[0]+1}' ip.txt
line: 1 pos: 1
line: 1 pos: 3
line: 1 pos: 5
line: 1 pos: 7
line: 1 pos: 9
line: 9 pos: 2
line: 10 pos: 9

来自perldoc

$-[0] 是最后一次成功匹配开始的偏移量

$. 最后访问的文件句柄的当前行号。

while(/GA/g)遍历所有匹配项


传递变量

$ s='GAT' perl -lne 'while(/$ENV{s}/g){print "line: $. pos: $-[0]"}' ip.txt
line: 9 pos: 1


另请参阅: 如何在 Perl 中找到正则表达式匹配的位置?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM