bash - 带有 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,
我不能使用除sed
or以外的任何命令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
:
有色.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
推荐阅读
- mysql - 两个用户同时运行一个事务?
- url - Pjax 错误更改 url 然后发生服务器错误
- rxjs - @ngrx 选择器并行发射两次
- storybook - @storybook/addon-info 和 @material-ui/core 的问题
- gitlab - 如何在 gitlab 中推送到新创建的项目
- c++ - 读取 UNICODE_STRING 的缓冲区时访问冲突
- java - Swagger API 中声明为不需要的 QueryParam
- php - 警告:mysqli_fetch_row() 期望参数 1 为 mysqli_result,给定 null
- php - 如何在 URL 中添加参数以在同一页面上显示不同的内容?
- visual-studio-app-center - Xamarin UItest 是否支持本地?还是现在只适用于应用中心?