AWK |动态行到列转换

AWK |动态行到列转换

我的文件:

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设置为。12
  • 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

相关内容