【问题标题】:awk sed multiple rows and create column from variable patternawk sed 多行并从变量模式创建列
【发布时间】:2018-03-07 15:37:00
【问题描述】:

嗨,awkers 我实现了将文本格式化为以下形式以便对其进行处理

HEADLINE01;INTRO;0X555
;A;0X22;;3;device:notebook;
;SPORT;round:;overcome
;FOO;set:;123456
;B;0X21;;3;device:charger;
;SPORT;round:;otherside
;FOO;set:;465465
INFO;INTRO;0X554
;O;0X23;;8;device:pc;
;SPORT;round:;overcome
;FOO;set:;123456
;N;0X24;;13;device:infra;
;SPORT;round:;otherside
;FOO;set:;465465

并且找不到实现这一目标的方法

HEADLINE01;INTRO;0X555;A;0X22;;3;device:notebook;;SPORT;round:;overcome;FOO;set:;123456
HEADLINE01;INTRO;0X555;B;0X21;;3;device:charger;;SPORT;round:;otherside;FOO;set:;465465
INFO;INTRO;0X554;O;0X23;;8;device:pc;;SPORT;round:;overcome;FOO;set:;123456
INFO;INTRO;0X554;N;0X24;;13;device:infra;;SPORT;round:;otherside;FOO;set:;465465

它有很多行,无法将其格式化为正确的方式

我也将其转换为一行,但基于模式“HEADLINE01”或“INFO”的拆分对我不起作用,因为它会随着正在进行的其他行而变化

任何我都会欣赏的技巧

//处理的原始格式是这个

------------------------------BOOKING LOG-----------------------------------
lorem ipsum lorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsumlorem ipsum
-----------------------------------------------------------------
BOOKING:ENTRY:SYSTEM# SCAN
result:
No entry is found!
BOOKING:ENTRY::SYSTEM# SCAN
BOOKING:ENTRY::SYSTEM# SCAN
output:
system entry is:
  date sytem log year 
  HEADLINE01   INTRO  0X555 
  log output list: 56456 lines 
    system device data transfer echoed NOK
    A    0X22;      3;device:notebook
        XX: BASE 
        SPORT round: overcome
        FOO set: 465465

.... ....

谢谢你,继续前进

代码如下:

$ perl -ane 'print "$F[0] $F[1] $F[2]\n"' log | grep -E "^{1,5}HEADLINE01|A |SPORT|FOO" | sed -e 's/A /;A;/g; s/ /;/g; s/FOO/;FOO/g; s/SPORT/;SPORT/g;'


HEADLINE01;INTRO;0X555
;A;0X22;;3;device:notebook
;SPORT;round:;overcome
;FOO;set:;465465

【问题讨论】:

  • 请添加执行您提到的转换的代码。您可能只需要进行一些格式更改即可获得所需的结果。
  • hi 代码如下,$ perl -ane 'print "$F[0] $F[1] $F[2]\n"' log | grep -E "^{1,5}HEADLINE01|A |SPORT|FOO" | sed -e 's/A /;A;/g; s//;/g; s/FOO/;FOO/g; s/运动/;运动/g;' HEADLINE01;INTRO;0X555 ;A;0X22;;3;device:notebook ;SPORT;round:;overcome ;FOO;set:;465465
  • cmets 中的代码不可读;如果您从perl 开始,为什么此时切换到awk
  • 好吧,我试图通过并坚持这个:awk -F';' '{ for(i=1;i

标签: awk sed row multiple-columns


【解决方案1】:

awk 来救援!

理想情况下,您可以在一个awk 脚本中编写完整的转换程序。其次最好是将中间格式转换为所需的输出。

$ awk -F'\n' -v RS='(\n|^)[A-Z]+' -v OFS='' '
           NR>1 {print rt $1,$2,$3,$4; 
                 print rt $1,$5,$6,$7} 
                {rt=RT; sub("\n","",rt)}' file

HEADLINE01;INTRO;0X555;A;0X22;;3;device:notebook;;SPORT;round:;overcome;FOO;set:;123456
HEADLINE01;INTRO;0X555;B;0X21;;3;device:charger;;SPORT;round:;otherside;FOO;set:;465465
INFO;INTRO;0X554;O;0X23;;8;device:pc;;SPORT;round:;overcome;FOO;set:;123456
INFO;INTRO;0X554;N;0X24;;13;device:infra;;SPORT;round:;otherside;FOO;set:;465465

请注意,这需要gawks 多字符 RS 支持。

【讨论】:

  • 它就像一个魅力,我需要将第一个输入文件转换为正确的 unix 格式,现在我可以在多个日志结构上使用它,像这样,感谢 karakfa 对我的探索工作的耐心和支持带文本处理,谢谢
  • 我通过添加循环 for ((i = 3; i 1 {print rt $1,$2,$3,$4;打印 rt $1,$5,$6,$7;} {rt=RT; sub("\n","",rt)}' 行;完成但“print rt $1,$2,$ ..:”仍然固定为仅打印每行而不是直到下一个模式 INFO 或相同的 HEADLINE01 开始
  • 不理解评论。它将保持与前缀相同的字段;这就是您的示例输入/输出的方式。
【解决方案2】:

为了避免回车/换行,请使用 printf:

awk '{ printf("%s",$0) }'

【讨论】:

  • 是的,我在“单行”输出中也有它,但无法在格式化的列中实现所需的输出,如上部分/上面所述
猜你喜欢
  • 2016-01-04
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多