Linux 将文件格式化并筛选为Csv表
我有一个包含许多日志的文件: 附言:这个问题的灵感来源于前面的一个问题。但略有改善Linux 将文件格式化并筛选为Csv表,linux,bash,awk,zsh,filefilter,Linux,Bash,Awk,Zsh,Filefilter,我有一个包含许多日志的文件: 附言:这个问题的灵感来源于前面的一个问题。但略有改善 10:00卡尔1号STR0 STR1 STR2 STR3[STR6 STR7]STR8: 学院/课程1:理论:SMTGHO:无: 学院/课程1:申请时间:SMTGHP:一小时: 10:00卡尔2号STR0 STR1 STR2 STR3[STR6 STR111]STR8: 学院/课程2:理论:SMTGHM:数学: 学院/课程2:申请时间:两小时: 10:00 david 1 STR0 STR1 STR2 STR3[
10:00卡尔1号STR0 STR1 STR2 STR3[STR6 STR7]STR8:
学院/课程1:理论:SMTGHO:无:
学院/课程1:申请时间:SMTGHP:一小时:
10:00卡尔2号STR0 STR1 STR2 STR3[STR6 STR111]STR8:
学院/课程2:理论:SMTGHM:数学:
学院/课程2:申请时间:两小时:
10:00 david 1 STR0 STR1 STR2 STR3[STR6 STR155]STR8:
学院/课程3:OFORY:SMTGHK:geo:
学院/课程3:申请时间:半小时:
10:00 david 2 STR0 STR1 STR2 STR3[STR6 STR74]STR8:
学院/课程4:理论:SMTGH:SMTGHI:历史:
学院/课程4:of应用程序:SMTGHJ:nothing:
14:00卡尔1号STR0 STR1 STR2 STR3[STR6 STR784]STR8:
学院/课程5:理论:SMTGHG:无:
学院/课程5:OF应用程序:SMTGHH:2小时:
14:00卡尔2号STR0 STR1 STR2 STR3[STR6 STR85]STR8:
学院/课程6:理论:SMTGHE:音乐:
学院/课程6:OF应用程序:SMTGHF:2小时:
14:00 david 1 STR0 STR1 STR2 STR3[STR6 STR01]STR8:
学院/课程7:理论:SMTGHC:编程:
学院/课程7:OF应用程序:SMTGHD:1小时:
14:00 david 2 STR0 STR1 STR2 STR3[STR6 STR66]STR8:
学院/课程8:理论:SMTGHA:哲学:
学院/课程8:of应用程序:SMTGHB:nothing:
我已尝试应用以下代码,但徒劳无功:
开始{
#设置以空行分隔的记录
RS=“”
#设置用换行符分隔的字段,每条记录有3个字段
FS=“\n”
}
{
#删除记录每一行中不需要的部分
次级(“at”,”,$1)
#现在把剩下的按时间和路线储存起来
时间=$1
课程=$1
#从字符串中删除时间以提取课程标题
分(“^[^]*”,“课程”)
#删除课程标题以从字符串中检索时间
分科(课程,“,时间)
#从每条记录的第二行获取理论信息
sub(“课程:理论:”,“,$2)
#从第三行获取应用程序信息
次级(“课程:申请:”,“,$3)
#如果是新课程
如果(!(标题中的课程)){
#保存标题信息(输出中每行的第一个字)
标题[课程]=课程
理论[课程]=“理论”
应用程序[课程]=“应用程序”
}
#将相关信息附加到输出字符串
标题[课程]=标题[课程],“时间”
理论[课程]=理论[课程],“$2
应用程序[课程]=应用程序[课程],“$3
}
结束{
#现在对于找到的每个课程
用于(输入标题){
#打印构造的字符串
打印标题[键]
印刷理论[关键]
打印应用程序[按键]
打印“”
}
为了获得此输出,是否需要使用这些字符串STR*和SMTGH*:
卡尔1,10:00,14:00
应用,半小时,一小时
理论、地理、编程
卡尔2,10:00,14:00
应用程序,没有,没有
理论、历史、哲学
大卫1,10:00,14:00
一个小时,两个小时
理论,没有,没有
大卫2,10:00,14:00
敷贴,两小时,两小时
理论、数学、音乐
GNU awk
awk -F: -v OFS=, '
/^at/ {
split($0, f, " ")
time = f[2]
course = f[3] " " f[4]
times[course] = times[course] OFS time
}
$2 == "oftheory" {th[course] = th[course] OFS $(NF-1)}
$2 == "ofapplicaton" {ap[course] = ap[course] OFS $(NF-1)}
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (c in times) {
printf "%s%s\n", c, times[c]
printf "application%s\n", ap[c]
printf "theory%s\n", th[c]
print ""
}
}
' file
carl 1,10:00,14:00
application,onehour,twohours
theory,nothing,nothing
carl 2,10:00,14:00
application,twohour,twohours
theory,math,music
david 1,10:00,14:00
application,halfhour,onehours
theory,geo,programmation
david 2,10:00,14:00
application,nothing,nothing
theory,history,philosophy