好的,我会尝试在这里描述我的问题。我有一个看起来像这样的文件:
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来使这个逻辑工作,但似乎无法弄明白。任何帮助或推动正确的方向都会很棒。提前谢谢!
答案 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