Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
Awk 如何搜索模式文本并在一行中转置,直到下一次找到相同的文本?_Awk - Fatal编程技术网

Awk 如何搜索模式文本并在一行中转置,直到下一次找到相同的文本?

Awk 如何搜索模式文本并在一行中转置,直到下一次找到相同的文本?,awk,Awk,我正试图用方括号中的时间戳头解析日志文件。如果找到方括号,那么它下面的所有行将被转置,直到下一次找到相同的方括号? 我有以下格式的数据: [2017-03-31 01:15:08.000] LTEEvent Event { recordLength 4, recordType 0, FileHeader { file-format-version T, pm-recording-version C, pm-recording-revision R, year 2, month 3, day 3,

我正试图用方括号中的时间戳头解析日志文件。如果找到方括号,那么它下面的所有行将被转置,直到下一次找到相同的方括号? 我有以下格式的数据:

[2017-03-31 01:15:08.000] LTEEvent
Event {
recordLength 4,
recordType 0,
FileHeader {
file-format-version T,
pm-recording-version C,
pm-recording-revision R,
year 2,
month 3,
day 3,
hour 1,
minute 1,
second 8,
ne-user-label LD,
ne-logical-name LD
}
} 
[2017-03-31 01:15:08.000] LTEEvent
Event {
recordLength 1,
recordType 3,
ScannerConnection {
hour 1,
minute 1,
second 8,
millisecond 0,
scanner-id '0'H,
status 2,
padding '0'H
}
}
and so on......The number of lines after[Date Time] LTE Event is not fixed and keeps on changing
我正在寻找excel中的输出,如:

[2017-03-31 01:15:08.000] LTEEvent  LTEEvent {  recordLength 417    
[2017-03-31 01:15:08.000] LTEEvent  LTEEvent {      
试试这个(如果你的文件没有
*

编辑1:使用新输入

awk '{printf "%s ", $0} END {printf "\n"}' f | sed 's/\[201/\n\[201/g' |nl

     1  [2017-03-31 01:15:08.000] LTEEvent Event { recordLength 4, recordType 0, FileHeader { file-format-version T, pm-recording-version C, pm-recording-revision R, year 2, month 3, day 3, hour 1, minute 1, second 8, ne-user-label LD, ne-logical-name LD } }  
     2  [2017-03-31 01:15:08.000] LTEEvent Event { recordLength 1, recordType 3, ScannerConnection { hour 1, minute 1, second 8, millisecond 0, scanner-id '0'H, status 2, padding '0'H } } and so on......The number of lines after[Date Time] LTE Event is not fixed and keeps on changing 
如果您得到预期的输出,则在命令末尾替换
|nl

在awk中被滥用:

$ awk 'BEGIN{ORS=""}{sub(/,$/,"\n")}1' file
[2017-03-31 01:15:08.000] LTEEventLTEEvent {recordLength 417
[2017-03-31 01:15:08.000] LTEEventLTEEvent
更多

输入

$ cat file
[2017-03-31 01:15:08.000] LTEEvent
LTEEvent {
recordLength 417,
[2017-03-31 01:15:08.000] LTEEvent
LTEEvent {
$ awk -v RS=, '{ $1=$1 }1' file
[2017-03-31 01:15:08.000] LTEEvent LTEEvent { recordLength 417
[2017-03-31 01:15:08.000] LTEEvent LTEEvent {
输出

$ cat file
[2017-03-31 01:15:08.000] LTEEvent
LTEEvent {
recordLength 417,
[2017-03-31 01:15:08.000] LTEEvent
LTEEvent {
$ awk -v RS=, '{ $1=$1 }1' file
[2017-03-31 01:15:08.000] LTEEvent LTEEvent { recordLength 417
[2017-03-31 01:15:08.000] LTEEvent LTEEvent {
解释

awk '/^\[/{                               # search for line starts with [
         if(s)print s;s=""                # if variable s has something print and reset
     }
     {
       sub(/,$/,"");                      # remove comma before the line terminator from record
       s =(s ? s OFS:"") $0               # concatenate variable s with current record
     }
  END{                                    # end block
       if(s)print s                       # if s has something print 
     }' file
  • -v RS=,
    记录分隔符设置为逗号

  • $1=$1
    当您执行
    $1=$1
    (或对字段的任何其他赋值)时,它会导致重新编译记录,其中
    $0
    会被每个
    FS
    替换为
    OFS
    ,因此它会将输出字段分隔符(OFS)设置为默认值(即单个空格),从而删除换行字符

  • 1
    执行默认操作
    {print$0}

$ awk '/^\[/{if(s)print s;s=""}{sub(/,$/,"");s =(s ? s OFS:"") $0}END{if(s)print s}' file
[2017-03-31 01:15:08.000] LTEEvent LTEEvent { recordLength 417
[2017-03-31 01:15:08.000] LTEEvent LTEEvent {
解释

awk '/^\[/{                               # search for line starts with [
         if(s)print s;s=""                # if variable s has something print and reset
     }
     {
       sub(/,$/,"");                      # remove comma before the line terminator from record
       s =(s ? s OFS:"") $0               # concatenate variable s with current record
     }
  END{                                    # end block
       if(s)print s                       # if s has something print 
     }' file

@user3683441您的输入文件中是否只有这样的数据或其他不相关的数据?因为如果有其他行,它可能会影响解决方案的执行derived@VIPINKUMAR很可能,但我想滥用它(缺少的逗号):d您要求做的不是
转置
文本<代码>附加可能…嗨,代码对我不起作用,可能是我提供的数据不充分,我用更多的数据再次编辑了这个问题。为什么
echo$(cat f)
?这是
awk'{for(i=1;如果输入文件中存在
$HOME
*
的话,它将失败。由于在sed命令中使用了
\n
,它也不可移植。@EdMorton-谢谢你的建议,我在回答中添加了你的评论,在这种情况下除了awk之外,你的建议是什么?Hi Vipin,After代码中,我将以连续流的形式在一行中获取所有日志文件,而不是在不同的行中获取。但是,是否有可能以csv格式获取输出,以便我可以以Excel格式进行分析?hedge:上述命令对我有效,只是问题是,每当我以txt格式获取输出时,它都符合预期,但只要我给出输出为csv/xls,然后返回到正常的垂直格式。是否有解决方法?@user3683441:您希望如何获得输出?所有内容都在一列中?第一个时间戳的内容应在不同的列中,但在一行中,然后对于下一个时间戳,内容应在不同的列中,但在一行中,并继续。...