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

标签 linux bash shell search awk

背景信息:

我正在尝试在文件中搜索模式(字符串)。我想打印该行以及该行中找到该模式的位置。

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

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

代码(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

关于linux - awk 找到第一个匹配项,而不是所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876084/

相关文章:

linux - 从汇编中的键盘读取整数(Linux IA-32 x86 gcc gas)

linux - 如何从 80 以外的其他端口从 apache2(来自 GCP 的 linux)访问网站?

c++ - boost 线程 : Use of deleted function Error

linux - BASH:如何通过 ftp 传输文件名变量

bash - 使用 ffmpeg 生成原始音频波形无法正常工作(不显示剪辑)

bash - bashrc 中的别名不起作用 - 其他一切都是

postgresql - 永久设置 PGDATA 环境变量 Mac

bash - 是否可以在进入目录时自动进行一些 shell 调用?

linux - 我在snapcraft上上传了snap,现在如何删除它?

linux - 在 Shell 脚本中使用动态变量生成 JSON