1

我有一个这样的文本文件:

********** time1 **********
line of text1
line of text1.1
line of text1.2
********** time2 **********
********** time3 **********
********** time4 **********
line of text2.1
line of text2.2
********** time5 **********
********** time6 **********
line of text3.1

我想提取文本行和它上面的时间(没有星星)并将其存储在一个文件中。(必须忽略它们下面没有文本行的时间)。我想最好用 grep 和 awk 来做这件事。因此,例如,我对上述代码的输出应该是

time1 : line of text1
time1 : line of text1.1
time1 : line of text1.2
time4 : line of text2.1
time4 : line of text2.2
time6 : line of text3

我该怎么做?

4

7 回答 7

2

这假设时间中没有空格,并且每个时间标记之后只有一行(或零行)文本。

awk '$1 ~ /\*+/ {prev = $2} $1 !~ /\*+/ {print prev, ":", $0}' inputfile
于 2012-05-29T13:40:11.573 回答
2

与空间一起工作的时间:

awk '/^[^*]+/ { gsub(/*/,"",x);printf x": "; print };{x=$0}' data.txt
于 2012-05-29T14:13:30.753 回答
1

你可以这样做vim

:%s_\*\+ \(YOUR TIME PATTERN\) \*\+\_.\(\[^*\].*\)$_\1 : \2_ | g_\*\+ YOUR TIME PATTERN \*\+_d

那就是搜索TIME PATTERN行并保存时间模式和下一行(如果它不是以*. 然后从它们创建新行。然后删除所有剩余的TIME PATTERN行。

请注意,这假设时间模式线以*等结尾。

awk

awk '/\*+ YOUR TIME PATTERN \*+/ { time=gensub("\*+ (YOUR TIME PATTERN) \*+","\\1","g") }
     ! /\*+ YOUR TIME PATTERN \*+/ { print time " : " $0 }' INPUTFILE

还有其他方法可以做到这一点。

于 2012-05-29T13:33:20.210 回答
1

在 awk 中,请参阅:

#!/bin/bash

awk '
    BEGIN{
        t=0
    }
    {
        if ($0 ~ " time[0-9]+ ") {
            v=$2
            t=1
        }
        else if ($0 ~ "line of text") {
            if (t==1) {
                printf("%s : %s\n", v, $0)
            } else {
               t=0;
            }
        }
    }
' FILE

只需替换FILE为您的文件名。

于 2012-05-29T14:02:53.457 回答
0

这可能对您有用(GNU sed):

sed '/^\*\+ \S\+.*/!d;s/[ *]//g;$!N;/\n[^*]/!D;s/\n/ : /' file

解释:

  • *如果不删除,则查找以 's 开头的行。/^\*\+ \S\+.*/!d
  • 有时间线。删除*'s 和空格(留出时间)。s/[ *]//g
  • 获取下一行$!N
  • 检查第二行不以*' 开头,否则删除第一行/\n[^*]/!D
  • 得到预期的图案,\n用间隔替换:并打印。s/\n/ : /
于 2012-05-29T13:42:28.607 回答
0
awk '{ if( $0 ~ /^\*+ time[0-9] \*+$/ ) { time = $2 } else { print time " : " $0 } }' file
于 2012-05-29T14:08:55.490 回答
0
$ uniq -f 2 input-file | awk '{getline n; print $2 " : " n}'

如果您的时间戳中有空格,请将参数更改为-f选项,以便uniq仅比较*. 例如,使用-f XX-2 是时间戳中的空格数。此外,如果时间戳中有空格,则需要更改 awk。这些中的任何一个都可以工作:

$ uniq -f 3 input-file | awk -F '**********' '{getline n; print $2 " : " n}'
$ uniq -f 3 input-file | awk '{getline n; $1=""; $NF=""; print $0 ": " n }'
于 2012-05-29T17:02:23.277 回答