我的文件:
EventTime=20180726001317
ObjectOfReference=TCU_XXX202
SPtext=Heartbeat Failure
EAName=TCU_XXX202
EventTime=20180726001317
ObjectOfReference=TCU_XXX203
SPtext=Heartbeat Failure
EAName=TCU_XXX203
预期输出:
EventTime;ObjectOfReference;SPtext;EAName
20180726001317;TCU_XXX202;Heartbeat Failure;TCU_XXX202
20180726001317;TCU_XXX203;Heartbeat Failure;TCU_XXX203
我尝试使用 awk 脚本,但它不起作用:
awk -F\"= :\" '!/%a/&&/-EventTime|EAName|-ObjectOfReference|-SPtext|%A/{if(\$1 != \"%A\")printf \$NF\",\";else print \"\\n\"}'
答案1
使用 GNU awk
:
awk -F= '{a=(FNR!=NR)+1;printf "%s"(NR%4==0?RS:";"),$a} a==1&&NR>=4{nextfile}' file file
但是,如果您不需要标题行,这也可以完成这项工作(并且mawk
也可以使用):
awk -F= '{printf "%s"(NR%4==0?RS:";"),$2}' file
解释:
-F=
将字段分隔符设置为=
。a=(FNR!=NR)+1
:在第一个文件和第二个文件中$a
设置为。1
2
printf "%s"(NR%4==0?RS:";"),$a
:打印字符串,如果是第四行则打印行分隔符RS
,否则打印字段分隔符;
a==1&&NR>=4
:如果我们在第一个文件中并且处理了 4 行...nextfile
...开始处理下一个文件(这是 GNU 特定的)
输出:
EventTime;ObjectOfReference;SPtext;EAName
20180726001317;TCU_XXX202;Heartbeat Failure;TCU_XXX202
20180726001317;TCU_XXX203;Heartbeat Failure;TCU_XXX203