Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将文件格式化并筛选为Csv表_Linux_Bash_Awk_Zsh_Filefilter - Fatal编程技术网

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