首页 > 解决方案 > 带有 system() 的 awk 中的 sed 不起作用

问题描述

我有一个存储学生学习的课程内容的文件:

样品outputA

------------------------------------------------------------------------------------------------------------------------
                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 脚本将它们回显到终端,每行根据课程标签着色。关于如何着色的信息在另一个文件中给出:

要处理的源 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,

我不能使用除sedor以外的任何命令awk

我想做这样的事情(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

标签: bashawksed

解决方案


你只能这样做awk

有色.awk

#!/usr/bin/awk -f
function color_code(name) {
    switch(name) {
        case "BLACK":
            return 30
        case "RED":
            return 31
        case "GREEN":
            return 32
        case "YELLOW":
            return 33
        case "BLUE":
            return 34
        case "PURPLE":
            return 35
        case "CYAN":
            return 36
        case "WHITE":
            return 37
        default:
            return 37
    }   
}

function colored(str, fg_name, bg_name) {
    fg_code = color_code(fg_name)
    # The background color codes are the foreground color codes + 10
    bg_code = color_code(bg_name) + 10
    return "\033["fg_code";"bg_code"m"str"\033[0m"
}

# Read color assignments
NR==FNR {
    if (NR < 2) {
        next
    }   
    split($0,a,",")
    f[a[1]]=a[3]
    b[a[1]]=a[4]
    next
}

{
    for (i in f) {
        repl = colored(i, f[i], b[i])
        $0 = gensub(i, repl, 1)
    }   
    print
}

使文件可执行并像这样运行它:

chmod +x colored.awk
./colored.awk resources/creditsRequirements.csv outputA

推荐阅读