【发布时间】:2016-07-13 21:58:01
【问题描述】:
我试图在匹配后获取下一条记录的确切字段,例如,如果“string1”在 $2 中匹配,那么我需要获取下一条记录的 $2 的值。我有大约 100 个这样的字符串来匹配每个在输入文件中恰好出现一次的字符串。但是相同的搜索字符串可以出现在不同的输入文件中(我有超过 1000 个这样的输入文件)。
示例输入:逗号分隔
10.217.250.162,NTTN_EMS,Radio / AMR Configuration Slot02,
RX RF Frequency Slot02,Channel Spacing Slot02,AMR Range (QPSK) Slot02,AMR Range (16QAM) Slot02
37740.500 [MHz],7 [MHz],Enable,Enable
10.217.250.162,NTTN_EMS,Radio / AMR Configuration Slot03,
RX RF Frequency (Slot03),Channel Spacing (Slot03),AMR Range (QPSK) {(Slot03)|(SW GRP2)},AMR Range (16QAM) {(Slot03)|(SW GRP2)}
37712.500 [MHz],7 [MHz],Enable,Enable
10.217.250.162,NTTN_EMS,Radio / AMR Configuration Slot04,
RX RF Frequency Slot04,Channel Spacing Slot04,AMR Range (QPSK) Slot04,AMR Range (16QAM) Slot04
,,,
10.217.250.162,NTTN_EMS,Radio / AMR Configuration Slot05,
RX RF Frequency (Slot05),Channel Spacing (Slot05),AMR Range (QPSK) {(Slot05)|(SW GRP3)},AMR Range (16QAM) {(Slot05)|(SW GRP3)}
string1,string2....是搜索模式包含字母数字与 ({| 之间。 值字段可以为空。 字段数不固定。 string1 的位置不固定。可能出现在不同的位置,但在文件中只会出现一次。
到目前为止我尝试了什么:
BEGIN {
FS=OFS=","
}
{for (i=1;i<=NF;i++){
if ($i == "string1"){
getline val;
split(val,a,",");
am1=a[i]}
if ($i == "string2"){
getline val;
split(val,a,",");
am2=a[i]}
}
}
END {print am1,am2}
我知道这对于给定的输入不起作用,因为 i 会针对连续的 value1 和 value2 进行更改。我应该为每个搜索字符串使用不同的 for 循环吗?或建议任何解决方案。
用于搜索
string1="AMR Range (QPSK) Slot02",string2="AMR Range (QPSK) {(Slot03)|(SW GRP2)}",string3="AMR Range (QPSK) Slot04",string4="AMR Range (16QAM) Slot02"
期望的输出:
10.217.250.162,NTTN_EMS,Enable,Enable,,Enable
【问题讨论】:
-
你的另一个输入文件在哪里,它是什么样子的,它叫什么?
-
edit 你的问题要包含一个带有简洁、可测试的样本输入的minimal reproducible example(两个输入文件,并将所有
blahs、strings 和values 替换为有意义的代表值)和给定输入的预期输出。如果您正在考虑使用getline,请务必先阅读并完全理解awk.freeshell.org/AllAboutGetline的所有含义和注意事项 -
@MarkSetchell 其他输入文件格式相同,只是搜索字符串位置不同。
-
@Ed Morton 我已经更改了输入和输出数据。我首先尝试使用没有可变格式的 getline 并意识到应该避免它的艰难方式。浏览完这个文档后,我发现 getline 变量格式更安全。我已经考虑过您在匹配 '!--c;/pattern/{c=N}' 文件后打印第 n 条记录的解决方案,但无法弄清楚如何获取特定字段。我仍然不了解 getline 及其注意事项,因此任何没有 getline 的解决方案都可以。如果我能得到一个文件的解决方案,那么我将能够将脚本应用于多个文件。