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:您希望如何获得输出?所有内容都在一列中?第一个时间戳的内容应在不同的列中,但在一行中,然后对于下一个时间戳,内容应在不同的列中,但在一行中,并继续。...