是否可以使用awk以与使用grep相同的方式突出显示搜索短语?
给出以下文件
>基因
AAATTTGCAGAGATTACAGGGGGGG
这个grep命令$ grep --color=auto GATTACA file.txt
产生
AAATTTGCAGA的 GATTACA GGGGGGG
粗体是彩色文字。
因为我实际使用的文件的模式跨越多行,所以我使用的是awk而不是grep。所以文件看起来像这样:
>基因
AAATTTGCAGAGAT
TACAGGGGGGG
我可以使用以下awk代码用我的短语
打印记录awk 'BEGIN{RS=">"; FS="\n";}/GATTACA/{print$0}' file.txt
返回
基因
AAATTTGCAGAGATTACAGGGGGGG
但我希望我的模式是一种颜色(如grep cmd):
基因
AAATTTGCAGA的 GATTACA GGGGGGG
任何帮助都会非常感激,因为我还是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
返回
基因
AAATTTGCAGAGATTACAGGGGGGG
我也试过这个:
awk 'BEGIN{RS=">"; FS="\n";}"\033[0;32m"/GATTACA/"\033[0m"{print$0}' file.txt
只返回错误:
awk:(FILENAME = nametest.txt FNR = 1)致命:尝试除零
我只是不确定如何将颜色代码合并到搜索字词中。可能是我的awk代码需要完全重新格式化。请告诉我!再次感谢!
答案 0 :(得分:0)
Lars Fischer在comment中回答了这个问题。这个社区wiki帖子正式化(并改进)它。
要仅对搜索字词进行着色,您可以对这些颜色代码使用全局替换(gsub
):
awk 'BEGIN { RS=">"; FS="\n" } gsub(/GATTACA/, "\033[0;32m&\033[0m", $0)' file
这会将记录分隔符(RS
)设置为>
而不是默认\n
(换行符),将字段分隔符(FS
)设置为{{1}而不是其他空白字符的默认值。然后,它对该查询执行全局替换,将文本替换为正确颜色代码所包围的文本。
\n
返回它所做的替换次数,默认情况下没有命令的子句被打印,所以这段代码运行替换作为子句,因此gsub
打印当且仅当有替换时。 (awk
完成其工作,当没有替换时返回零(false),当有替换时返回非零(true)。)