bash - awk 内的 sed 与 system() 不起作用

标签 bash awk sed

我有一个文件存储学生所修类(class)内容:

示例输出A:

------------------------------------------------------------------------------------------------------------------------
                Year            Semester                Code             Credits                 Tag         letterGrade
------------------------------------------------------------------------------------------------------------------------
                2019              Autumn              CS 753                   6 Department elective                  AB
                2019              Autumn              CS 490                   6         Honors core                  CC
                2019              Autumn              CS 492                   6         Honors core                  FR
                2019              Autumn              CS 747                   6 Department elective                  FF
                2019              Autumn              ES 200                   3      Basic Sciences                  BC
                2019              Autumn              ET 601                   6  Institute Elective                  BB

我想使用 bash 脚本将它们回显到终端,每行根据类(class)标签着色。 有关如何着色的信息在另一个文件中给出:

源 CSV 来处理./resources/creditsRequirements.csv:

tag,credits,color_FONT,color_BACKGROUND,
Basic Sciences,62,CYAN,BLACK,
Engineering Science,29,BLACK,GREEN,
HSS Elective,12,GREEN,BLACK,
Institute Elective,12,BLACK,WHITE,
Core course,117,BLACK,CYAN,
Department elective,36,YELLOW,BLACK,
Honors core,24,WHITE,BLACK,
Minor,30,MAGENTA,WHITE,
Additional Learning,0,RED,WHITE,

除了 sedawk 之外,我无法使用任何命令。

我想做这样的事情(outputA./resources/creditRequirements.csv 是命令行参数):

awk -F"," 'NR!=1{system("sed -e 's/^.\{1,\}($1).\{1,\}$/(code for color)&(code for reset)/g' "$1)}' $2

但是这种情况正在发生(我使用了更短的 sed 命令只是为了测试它):

./viewWithColor.sh outputA ./resources/creditsRequirements.csv
awk: cmd. line:1: NR!=1{system("sed -e /[0-9]/
awk: cmd. line:1:              ^ unterminated string
awk: cmd. line:1: NR!=1{system("sed -e /[0-9]/
awk: cmd. line:1:              ^ syntax error

最佳答案

这将执行您在发布的 awk{system(sed)) 调用中尝试执行的操作,您只需使用要使用的颜色代码的映射来填充它(例如,请参阅 https://stackoverflow.com/a/28938235/1745001) .

$ cat tst.awk
BEGIN { FS = "," }
NR==FNR {
    if (FNR>1) {
        font[$1]  = $3
        back[$1]  = $4
        reset[$1] = "RESET"
    }
    next
}
{
    tag = $0
    sub(/^([[:space:]]+[^[:space:]]+){5}[[:space:]]+/,"",tag)
    sub(/[[:space:]]+[^[:space:]]+$/,"",tag)
    print back[tag] font[tag] $0 reset[tag]
}

$ awk -f tst.awk reqs.csv fileA
------------------------------------------------------------------------------------------------------------------------
                Year            Semester                Code             Credits                 Tag         letterGrade
------------------------------------------------------------------------------------------------------------------------
BLACKYELLOW                2019              Autumn              CS 753                   6 Department elective                  ABRESET
BLACKWHITE                2019              Autumn              CS 490                   6         Honors core                  CCRESET
BLACKWHITE                2019              Autumn              CS 492                   6         Honors core                  FRRESET
BLACKYELLOW                2019              Autumn              CS 747                   6 Department elective                  FFRESET
BLACKCYAN                2019              Autumn              ES 200                   3      Basic Sciences                  BCRESET
WHITEBLACK                2019              Autumn              ET 601                   6  Institute Elective                  BBRESET

例如像这样的东西:

$ cat tst.awk
BEGIN {
    FS = ","

    map["RESET"] = "\033[0m"

    fg_map["BLACK"]  = "\033[0;30m"
    fg_map["RED"]    = "\033[0;31m"
    fg_map["GREEN"]  = "\033[0;32m"
    fg_map["YELLOW"] = "\033[0;33m"
    fg_map["BLUE"]   = "\033[0;34m"
    fg_map["PURPLE"] = "\033[0;35m"
    fg_map["CYAN"]   = "\033[0;36m"
    fg_map["WHITE"]  = "\033[0;37m"

    bg_map["BLACK"]  = "\033[0;40m"
    bg_map["RED"]    = "\033[0;41m"
    bg_map["GREEN"]  = "\033[0;42m"
    bg_map["YELLOW"] = "\033[0;43m"
    bg_map["BLUE"]   = "\033[0;44m"
    bg_map["PURPLE"] = "\033[0;45m"
    bg_map["CYAN"]   = "\033[0;46m"
    bg_map["WHITE"]  = "\033[0;47m"

}
NR==FNR {
    if (FNR>1) {
        font[$1]  = $3
        back[$1]  = $4
        reset[$1] = "RESET"
    }
    next
}
{
    tag = $0
    sub(/^([[:space:]]+[^[:space:]]+){5}[[:space:]]+/,"",tag)
    sub(/[[:space:]]+[^[:space:]]+$/,"",tag)
    print bg_map[back[tag]] fg_map[font[tag]] $0 map[reset[tag]]
}

关于bash - awk 内的 sed 与 system() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448342/

相关文章:

bash - 用于终端提示的基本 bash 脚本

regex - 这样匹配对吗?

bash - awk 在使用三个 && 条件保存文件时更改字段分隔符

linux - awk 模式总是匹配最后一条记录?

bash - 如何将输出限制为终端宽度

bash - awk:保留具有最高值的记录,比较那些共享其他字段的记录

使用 sed 命令从文本文件中提取字符串

shell - sed命令删除字符串的一部分

linux - 如何阻止sed插入换行符?

bash - 如何检查变量是否包含在 BASH 条件列表中找不到的字符?