【问题标题】:awk/grep replace 2nd match after first match in text file while in foreach loopawk/grep 在 foreach 循环中替换文本文件中第一个匹配后的第二个匹配
【发布时间】:2013-11-21 05:50:28
【问题描述】:

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

斯塔 WP00 34.07335 -106.91932 1.43

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

净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/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

#

斯塔 WP00 34.07335 -106.91932 1.43

时间 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)。我想替换第一个和第二个“close”语句的时间,

即关闭传感器 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。

我有这个文本文件,我正在按站循环,所以我希望能够为任何第 n 个条目自动执行此操作。我尝试过以各种方式使用 grep、awk 和 sed 来让这个逻辑工作,但似乎无法弄清楚。任何帮助或推动正确的方向都会很棒。提前致谢!

【问题讨论】:

    标签: foreach sed awk grep


    【解决方案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
    

    【讨论】:

    • 肯特,谢谢!查看 bash 中的语法。我对 bash 不太熟悉,对 csh 和 tsch 更熟悉,所以我有一些问题……这似乎适用于第一站。如果我在每个站点循环,说 stalist="WP00 WP01 WP02 WP03 WP04" 会是 x 还是 a?我尝试了两种方法,但似乎没有用。我该怎么做?对不起,如果这是一个愚蠢的问题。它似乎也输出到屏幕上,我尝试用管道传输它,但似乎没有用。我是这方面的新手。也许确切地解释它在做什么也会帮助我。感谢您的帮助!
    • 好的,我想我理解循环了。 NR 是自程序执行开始以来 awk 已处理的输入记录数。 FNR 是当前文件中的当前记录号。一旦找到 close 语句, i++ 就会增加 i 的值并重复循环。当 i
    • 好的,这适用于第一站,但问题是可能有超过 3 个条目,可能有数百个。我只想参加第三场比赛并替换之前的两场比赛,然后继续前进。我想为站列表中的每个站执行此操作,因此如果 stalist = "WP00 WP01" 我想为 WP00 的所有条目执行此操作,然后继续浏览文件并为 WP01 的所有条目执行此操作等等。这有意义吗?我将如何修改这部分代码来做到这一点?
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多