Loops foreach循环中两个关键字的awk

Loops foreach循环中两个关键字的awk,loops,replace,awk,pattern-matching,Loops,Replace,Awk,Pattern Matching,我有一个文本文件,我想循环通过一个特定的关键字,并找到该子组的另一个关键字。实际上,一旦它循环通过特定的关键字,我想找到第二个关键字的最后一个列出的条目,并将日期和时间更改为“12/31/2500 23:59:59” 文本文件如下所示: sta first keyword lat long depth time date time add second keyword sensor type date time sensor add second keyword sensor type 10

我有一个文本文件,我想循环通过一个特定的关键字,并找到该子组的另一个关键字。实际上,一旦它循环通过特定的关键字,我想找到第二个关键字的最后一个列出的条目,并将日期和时间更改为“12/31/2500 23:59:59”

文本文件如下所示:

sta first keyword lat long depth
time date time
add
second keyword sensor type date time

sensor
add 
second keyword sensor type 10/31/2013 23:59:59
----------------------------------------------
sta first keyword lat long depth
time date time
add
second keyword sensor type date time

sensor
add 
second keyword sensor type date time 
因此,我希望遍历第一个关键字,并在文本文件中找到第二个关键字的最后一个条目,并将“第二个关键字传感器类型日期时间”行中的日期时间更改为12/31 2500(数据)和23:59:59(时间)

我想用awk做这件事,但一直没有找到一个好方法。有人能帮我摆脱困境或指引我走上正确的方向吗?我对awk比较陌生,仍然在学习和阅读语法结构

上述的预期输出将是:

sta first keyword lat long depth
time date time
add
second keyword sensor type date time

sta first keyword lat long depth
time date time
add 
second keyword sensor type 12/31/2500 23:59:59
请注意,可能不止上面显示的2个文本块

我对循环的想法要么在awk中,要么在foreach循环中,所以 foreach i(第一个关键字) awk#####

像这样的,或者只是用awk。整个文本块彼此关联,因为有不同的sta first关键字条目。这些是我将要呼叫的电台名称。有道理还是还需要更多的解释

要进一步更新此问题,请执行以下操作: 这是我在帮助和我自己的帮助下为我的另一个问题(评论中有一个链接)的第一部分开发的内容:

这样做的目的是从下一个站块定义中提取时间,并将其放入上一个站块的关闭时间(一个站块的两个关闭语句)中,然后减去1秒

为了澄清,每个车站区段包含2个关闭语句,这并不像我希望的那样清晰。因此,上面的条目将是一个站块,我添加了另一个站块,可以是不同的站名,即WP00,然后是WP01。我想做的是最后一个电台条目(包含两个关闭语句),使这两个关闭语句都是12/31/2500。我想用我的awk声明为每个车站的其余车站街区维护我上面所做的

我希望这有助于澄清我的意思:)

为了进一步更新问题,我认为在哈肯的帮助下,以下是解决方案:

awk -F '[ : ]' '
NR==FNR {
    if (/time/)
        A[++N]=$2" "$3":"$4":"($5-01)
    else if (/close/) {
        B[FNR]=0
        n1=n2;
        n2=FNR;
    }
    else if (/^sta EP/) {
        match($0,/^sta EP([0-9]*)/,a)
        snr=a[1]
        if (snr != prev) {
            B[n1]=1
            B[n2]=1
        }
        prev=snr
    }
    next
}

FNR==1 {
    B[n1]=1; B[n2]=1
}
/time/ {
    M++
}
/close/ {
    if (B[FNR])
        $0=$1" ""sta"" ""12/31/2013 23:59:59"
    else if ((M%2) == 0 || (M%2) == 1) {
        NF=3
        $0=$0" "A[M+1]
    }
}
{print}' file file 
我稍微修改了一下,试图在脚本中不可避免地要用到的地方做一些不同的事情。但所有的碎片都在那里

来自您以前的帖子: 我发现您可能想在下一个
站点
关键字之前更改上一个
关闭
? 然后您可以尝试以下方法:

awk -f m.awk file file
其中,
file
是您的输入文件,
m.awk
是:

FNR==NR {
    if (/^close/) {
        z[++k]=FNR
        if (k==3) {
            key=$4 FS $5
            b[z[1]]=key
            b[z[2]]=key
        }
        prev=FNR
    } else if (/^sta/) {
        a[prev]=1
        k=0
    }
    next
}
FNR==1 { a[prev]=1 }
{
    if (/^close/) {
        if (FNR in b)
          $0=$1FS$2FS$3FS b[FNR]
        if (a[FNR])
            $0=$1FS$2FS$3FS"12/31/2500 23:59:59"
    }
    print
}
例如,给定以下输入文件:

sta WP00 34.07335 -106.91932 1.43

close sensor trillium_240_2 10/23/2013 20:10:17
bla

close sensor trillium_120 10/28/2013 20:20:45

close sensor trillium_80 10/28/2013 20:30:17

close sensor trillium_60 10/28/2013 20:40:29

close sensor trillium_40 10/28/2013 20:50:10

sta WP01 34.07335 -106.91932 1.43

close sensor trillium_240_2 10/23/2013 20:10:17
bla
bla

close sensor trillium_120 10/28/2013 20:20:45

close sensor trillium_120 10/28/2013 20:20:45

close sensor trillium_80 10/28/2013 20:30:17

close sensor trillium_40 10/28/2013 20:50:10
并运行
awk-f m.awk文件
给出输出:

sta WP00 34.07335 -106.91932 1.43

close sensor trillium_240_2 10/28/2013 20:30:17
bla

close sensor trillium_120 10/28/2013 20:30:17

close sensor trillium_80 10/28/2013 20:30:17

close sensor trillium_60 10/28/2013 20:40:29

close sensor trillium_40 12/31/2500 23:59:59

sta WP01 34.07335 -106.91932 1.43

close sensor trillium_240_2 10/28/2013 20:20:45
bla
bla

close sensor trillium_120 10/28/2013 20:20:45

close sensor trillium_120 10/28/2013 20:20:45

close sensor trillium_80 10/28/2013 20:30:17

close sensor trillium_40 12/31/2500 23:59:59
sta WP00 34.07335 -106.91932 1.43
time 10/23/2013 20:10:17
close sensor trillium_240_2 10/28/2013 20:20:27
add
close sensor trillium_120 10/28/2013 20:20:27
sta WP00 34.07335 -106.91932 1.43
time 10/28/2013 20:20:28
close sensor trillium_240_2 10/28/2013 20:20:28
close sensor trillium_120 10/28/2013 20:20:45
sta WP00 34.07335 -106.91932 1.43
time 10/28/2013 20:22:30
close sensor trillium_240_2 12/31/2500 23:59:59
close sensor trillium_120 12/31/2500 23:59:59
sta WP01 34.07335 -106.91932 1.43
time 10/23/2013 20:30:17
close sensor trillium_240_2 10/23/2013 20:10:17
add
close sensor trillium_120 10/23/2013 20:10:35
sta WP01 34.07335 -106.91932 1.43
time 10/28/2013 20:40:28
close sensor trillium_240_2 12/31/2500 23:59:59
close sensor trillium_120 12/31/2500 23:59:59
更新 根据以下评论中的讨论,我给出了一个新版本:

NR==FNR {
    if (/time/)
        A[++N]=$2" "$3":"$4":"($5-1)
    else if (/close/) {
        B[FNR]=0
        n1=n2;
        n2=FNR;
    }
    else if (/^sta WP/) {
        match($0,/^sta WP([0-9]*)/,a)
        snr=a[1]
        if (snr != prev) {
            B[n1]=1
            B[n2]=1
        }
        prev=snr
    }
    next
}

FNR==1 {
    B[n1]=1; B[n2]=1
}
/time/ {
    M++
}
/close/ {
    if (B[FNR]) {
        $0=$1" "$2" "$3" 12/31/2500 23:59:59"
    }
    else if (M%2) {
        NF=3
        $0=$0" "A[M+1]
    }
}
{print}
使用输入运行此命令:

sta WP00 34.07335 -106.91932 1.43
time 10/23/2013 20:10:17
close sensor trillium_240_2 10/23/2013 20:10:17
add
close sensor trillium_120 10/23/2013 20:10:35
sta WP00 34.07335 -106.91932 1.43
time 10/28/2013 20:20:28
close sensor trillium_240_2 10/28/2013 20:20:28
close sensor trillium_120 10/28/2013 20:20:45
sta WP00 34.07335 -106.91932 1.43
time 10/28/2013 20:22:30
close sensor trillium_240_2 10/28/2013 20:24:28
close sensor trillium_120 10/28/2013 20:25:45
sta WP01 34.07335 -106.91932 1.43
time 10/23/2013 20:30:17
close sensor trillium_240_2 10/23/2013 20:10:17
add
close sensor trillium_120 10/23/2013 20:10:35
sta WP01 34.07335 -106.91932 1.43
time 10/28/2013 20:40:28
close sensor trillium_240_2 10/28/2013 20:20:28
close sensor trillium_120 10/28/2013 20:20:45
产生输出:

sta WP00 34.07335 -106.91932 1.43

close sensor trillium_240_2 10/28/2013 20:30:17
bla

close sensor trillium_120 10/28/2013 20:30:17

close sensor trillium_80 10/28/2013 20:30:17

close sensor trillium_60 10/28/2013 20:40:29

close sensor trillium_40 12/31/2500 23:59:59

sta WP01 34.07335 -106.91932 1.43

close sensor trillium_240_2 10/28/2013 20:20:45
bla
bla

close sensor trillium_120 10/28/2013 20:20:45

close sensor trillium_120 10/28/2013 20:20:45

close sensor trillium_80 10/28/2013 20:30:17

close sensor trillium_40 12/31/2500 23:59:59
sta WP00 34.07335 -106.91932 1.43
time 10/23/2013 20:10:17
close sensor trillium_240_2 10/28/2013 20:20:27
add
close sensor trillium_120 10/28/2013 20:20:27
sta WP00 34.07335 -106.91932 1.43
time 10/28/2013 20:20:28
close sensor trillium_240_2 10/28/2013 20:20:28
close sensor trillium_120 10/28/2013 20:20:45
sta WP00 34.07335 -106.91932 1.43
time 10/28/2013 20:22:30
close sensor trillium_240_2 12/31/2500 23:59:59
close sensor trillium_120 12/31/2500 23:59:59
sta WP01 34.07335 -106.91932 1.43
time 10/23/2013 20:30:17
close sensor trillium_240_2 10/23/2013 20:10:17
add
close sensor trillium_120 10/23/2013 20:10:35
sta WP01 34.07335 -106.91932 1.43
time 10/28/2013 20:40:28
close sensor trillium_240_2 12/31/2500 23:59:59
close sensor trillium_120 12/31/2500 23:59:59

发布给定输入的预期输出,因为不清楚您想要什么。尤其不清楚“循环第一个关键字”是什么意思——你怎么能循环一个单词?确保您发布的示例输入文件包含实际的示例输入,而不仅仅是示例输入的抽象描述。我认为他的意思是循环通过由两个关键字分隔的块。但我不知道他真正的意思是什么,因为他只是想更改第二个关键字的最后一个条目,那么第一个关键字和它有什么关系呢?所以说使用我上面发布的两个条目,它会be@user1332577更新你的问题,不要试图把它放在评论中。这个问题和你以前的问题有什么不同?哈肯,非常接近。但是我只希望在下一个不同的站点关键字之前的最后一个站点关键字条目是12/31/2500。上述内容改变了其他每一个close语句的结束时间为12/31/2500,如果sta是我循环使用的变量,我在您之前的语句中如何调用它?也就是说,我试图通过WP00、WP01、WP02等循环,直到它识别出它是最后一个。这就是我挂断电话的地方。@user1332577我想它改变了station部分最后一个关键字,你试过了吗?(由于我使用了一个简单的例子,我觉得它似乎每隔一段时间就会发生变化)@user1332577我已经更新了我的答案,以展示如何将上一个问题中的内容合并到一起()我用编辑更新了我的问题,修改了你的脚本版本,以达到我的目的。我感谢你对我的帮助和你的坚持!我想做的最后一点是让它说“关闭sta staname 12/31/2013 23:59:59”,其中staname将是WP[0-9]*,你认为这很难做到吗?