在foreach循环中,awk / grep在文本文件中的第一个匹配后替换第二个匹配

时间:2013-11-20 21:17:26

标签: foreach sed awk grep

好的,我会尝试在这里描述我的问题。我有一个看起来像这样的文件:

sta WP00 34.07335 -106.91932 1.43

时间10/23/2013 20:10:17

net XO

datalogger Passcal_q330_linear 0100000EAA23E50F#2847

传感器trillium_240_2 0 583

    axis Z 0 0 - 1 1
    axis N 0 90 - 2 1
    axis E 90 90 - 3 1
    samplerate 40sps
    channel Z BHZ 00
    channel N BHN 00
    channel E BHE 00
    samplerate 1sps
    channel Z LHZ 00
    channel N LHN 00
    channel E LHE 00

添加

关闭传感器trillium_240_2 10/23/2013 20:10:17

传感器trillium_120 0 279

    axis Z 0 0 - 4 1
    axis N 0 90 - 5 1
    axis E 90 90 - 6 1
    samplerate 40sps
    channel Z BHZ 01
    channel N BHN 01
    channel E BHE 01
    samplerate 1sps
    channel Z LHZ 01
    channel N LHN 01
    channel E LHE 01

添加

关闭传感器trillium_120 10/23/2013 20:10:35

sta WP00 34.07335 -106.91932 1.43

time 10/28/2013 20:20:28

净XO 数据记录器Passcal_q330_linear 0100000EAA23E50F#2847

传感器trillium_240_2 0 583

    axis Z 0 0 - 1 1
    axis N 0 90 - 2 1
    axis E 90 90 - 3 1
    samplerate 40sps
    channel Z BHZ 00
    channel N BHN 00
    channel E BHE 00
    samplerate 1sps
    channel Z LHZ 00
    channel N LHN 00
    channel E LHE 00

添加

关闭传感器trillium_240_2 10/28/2013 20:20:28

传感器trillium_120 0 268

    axis Z 0 0 - 4 1
    axis N 0 90 - 5 1
    axis E 90 90 - 6 1
    samplerate 40sps
    channel Z BHZ 01
    channel N BHN 01
    channel E BHE 01
    samplerate 1sps
    channel Z LHZ 01
    channel N LHN 01
    channel E LHE 01

添加

关闭传感器trillium_120 10/28/2013 20:20:45

很抱歉给你这么长的文件,但我想确保你看到一切。每个站有更多的元数据块(sta,在这种情况下是WP00)。我想替换第一个和第二个“关闭”语句的时间,

即,关闭传感器trillium_240_2 10/23/2013 20:10:17和 关闭传感器trillium_120 10/23/2013 20:10:35 与第三个关闭声明的日期和时间。因此,我希望他们阅读关闭传感器trillium_240_2 10/28/2013 20:28:28并关闭传感器trillium_120 10/28/2013 20:28:28,依此类推每个站点条目块。

换句话说,我想使用第二个匹配的关闭语句时间和日期来替换之前的前两个。或者您可以将其视为第3个匹配的关闭语句时间和日期,替换前两个匹配的时间和日期。

另外为了使这更难,如果它是最后一个站点条目我想要关闭时间和日期是12/31/2500 23:59:59。

我有这个文本文件,我正在通过电台循环,所以我希望能够自动执行任何数量的条目。我尝试过以各种方式使用grep,awk和sed来使这个逻辑工作,但似乎无法弄明白。任何帮助或推动正确的方向都会很棒。提前谢谢!

1 个答案:

答案 0 :(得分:1)

这个命令应该做你想要的:

awk 'NR==FNR{
        if(/^close/){i++
            if(i<3)a[NR]=$1FS$2FS$3
            if(i==3)
                for(x in a)
                    a[x]=a[x]FS$4FS$5
            l=NR
        }
        next
    } 
    FNR in a{$0=a[FNR]}
    FNR==l{$0=$1FS$2FS$3FS"12/31/2500 23:59:59"}7' file file