【问题标题】:Awk - color multi-line pattern (like grep)?awk - 颜色多行模式(如 grep)?
【发布时间】:2016-09-15 17:37:09
【问题描述】:

是否可以像使用 grep 一样使用 awk 突出显示搜索短语?

给定以下文件

>基因

AAATTTGCAGAGATTACAGGGGGGG

这个 grep 命令$ grep --color=auto GATTACA file.txt 产生

AAATTTGCAGAGATTACAGGGGGGG

粗体是彩色文本。

因为我实际使用的文件具有跨越多行的模式,所以我使用的是 awk 而不是 grep。所以文件看起来像这样:

>基因

AAATTTGCAGAGAT

TACAGGGGGG

我可以使用下面的 awk 代码用我的短语打印记录

awk 'BEGIN{RS=">"; FS="\n";}/GATTACA/{print$0}' file.txt

返回

基因

AAATTTGCAGAGATTACAGGGGGGG

但我希望我的模式是一种颜色(如 grep cmd):

基因

AAATTTGCAGAGATTACAGGGGGGG

任何帮助将不胜感激,因为我对 unix 和 awk 还是很陌生。这个问题不是How to print awk's results with different colors for different fields? 的重复问题。这个问题的不同之处在于它要求为搜索词而不是整个字段着色。由于从技术上讲我正在打印整个字段{print$0},所以我的整个返回结果都会改变颜色。

awk 'BEGIN{RS=">"; FS="\n";}/GATTACA/{print "\033[0;32m"$0"\033[0m"}' file.txt

返回

基因

AATTTGCAGAGATTACAGGGGGGG

我也试过这个:

awk 'BEGIN{RS=">"; FS="\n";}"\033[0;32m"/GATTACA/"\033[0m"{print$0}' file.txt

只返回错误:

awk: (FILENAME=nametest.txt FNR=1) fatal: 除零尝试

我只是不确定如何仅将颜色代码合并到搜索词中。可能我的 awk 代码需要完全重新格式化。请告诉我!再次感谢!

【问题讨论】:

  • 尝试了该线程的解决方案,但无法仅突出显示搜索词。相反,整个字段都是彩色的。可能与多行搜索和使用“{print$0}”返回整个字段有关。只是不知道如何解决它。谢谢!
  • 要仅对搜索词进行着色,您可以使用具有如下颜色代码的 gsub:BEGIN { RS=">"; FS="\n"; gene="GATTACA"}$0 ~ gene { gsub( gene, "\033[0;32m&\033[0m", $0); print$0 } & 是找到的内容 (GATTACA)。

标签: shell unix awk grep


【解决方案1】:

Lars Fischer 在comment 中回答了这个问题。此社区 wiki 帖子对其进行了形式化(并改进)。

要仅对搜索词着色,您可以使用带有这些颜色代码的全局替换 (gsub):

awk 'BEGIN { RS=">"; FS="\n" } gsub(/GATTACA/, "\033[0;32m&\033[0m", $0)' file

这会将记录分隔符 (RS) 设置为 > 而不是默认的 \n(换行符),并将字段分隔符 (FS) 设置为 \n 而不是其他空白字符的默认值.然后它对该查询执行全局替换,将文本替换为由正确颜色代码包围的文本。

gsub 返回它进行的替换次数,默认情况下打印没有命令的子句,因此此代码将替换作为子句运行,awk 因此当且仅当进行了替换时才打印。 (gsub 完成它的工作并在没有替换时返回零 (false),当有替换时返回非零 (true)。)

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多