gpt4 book ai didi

shell - 根据几条规则突出显示制表符分隔值

转载 作者:行者123 更新时间:2023-12-01 10:21:34 25 4
gpt4 key购买 nike

我有一些制表符分隔的文件,我想有条件地突出显示某些列或某些值。

源文件示例:

wn       name          Building Name       8       Desc       char       -> bl
wo bl_id!* Building Code 8 char

我想:

  • 在名称后缀为“!”的情况下,将第 2 列的内容填入黄色
  • 在有第7列的情况下,用青色表示第2列的内容,用绿色表示第7列的内容
  • 在第 2 列中将小“*”标记为红色

以及其他一些此类规则。

目前我是这样做的:

cat file.tsv
| sed -r 's/^([^\t]*)\t([^\t]*)!/\1\t\x1b[33m\2!\x1b[0m/' \
| sed -r 's/^^([^\t]*)\t([^\t]*)\t(.*)\t-> ([^\t]+)/\1\t\x1b[36m\2\x1b[0m\t\3\t-> \x1b[32m\4\x1b[0m/' \
| sed -r 's/\*/\x1b[31;1m&\x1b[0m/'

但读取和更新起来相当复杂。

有没有更好的方法?我很确定,但是哪一个?

GRC 或 Supercat 之类的东西是否可行?不过,我不得不承认我有一个非常重要的约束:我希望解决方案在 Cygwin 中开箱即用。出于代码的可移植性原因,我不想在那里编译自己的工具。

您能否提供有关如何改进代码以获得这样的“突出显示”功能的提示?

最佳答案

你可以用 GNU awk 来做,像这样 (col.awk):

function colText ( text, col) { 
return sprintf("\033[%sm%s\033[39;0m", col, text);
}

function yellow( text ){ return colText( text, "33;1" ); }
function cyan ( text ){ return colText( text, "36;1" ); }
function green ( text ){ return colText( text, "32;1" ); }
function red ( text ){ return colText( text, "31;1" ); }

BEGIN {FS=OFS="\t";}

# red * in $2
$2 ~ /\*/ {gsub(/\*/, red("*"), $2); }

# cyan if col 7 present
NF == 7 {print $1, cyan($2), $3, $4, $5, $6, green( $7 ) ;
next;}

# yellow col2 if there is a !
$2 ~ /!/ {print $1, yellow($2), $3, $4, $5, $6, $7 }

像这样使用 gawk -f col.awk file.tsv

关于shell - 根据几条规则突出显示制表符分隔值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com