使用 awk 提取字符串的两部分

使用 awk 提取字符串的两部分

我想提取并打印字符串的两种模式

我的文件有数百行文本,但这里有两行。每行都有一个标记 F1、F2、F4、F4、F5、F6 和 F7,每个标记后面跟着 4 个字符。

F1A308F2A309 F3A310F4A311 F5A312F6A313F7A314

F1B308F2B309 F3B310F4B317 F5B312F6B313F7B315

我想提取模式“F2”后的 4 个字符和模式“F6”后的 4 个字符,以便输出为

A309 A314

B309 B313

为了进一步澄清,我只需要提取 F2 和 F4 之后的字符。

答案1

使用 Perl,对锚字符使用lookbehind:

$ perl -lne 'print join " ", /(?<=F2|F6)(.{4})/g' file
A309 A313

B309 B313

答案2

以下 awk 脚本是我认为您的要求的近似值:

{
  for(i=1;i<=NF;i++) {
    if (match($i, "F2....$") > 0) {
      printf "%s ", substr($i, RSTART + 2, 4);
    }
    if (match($i, "F6....$") > 0) {
      printf "% s", substr($i, RSTART + 2, 4);
    }
  }
  print ""
}

它循环遍历每一行,然后循环遍历该行的每个字段。对于每个元素,如果元素的尾部有“F2”后跟 4 个字符,则打印这 4 个字符,后跟一个空格。完成一行循环后,打印回车符。

根据您的输入,输出为:

A309 A314

B309 B315

awk 脚本的更新版本,为了处理其字段中任何位置存在的元素,只需要$删除锚定:

{
  for(i=1;i<=NF;i++) {
    if (match($i, "F2....") > 0) {
      printf "%s ", substr($i, RSTART + 2, 4);
    }
    if (match($i, "F6....") > 0) {
      printf "% s", substr($i, RSTART + 2, 4);
    }
  }
  print ""
}

答案3

这个怎么样:

echo 'str' | egrep -o '(F2|F6)....' | egrep -o '....$' | xargs -n2

相关内容