我有一个文件存储学生所修类(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,
除了 sed
或 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
最佳答案
这将执行您在发布的 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/