awk搜索多行记录文件的多个字段

时间:2010-08-09 09:30:45

标签: bash shell awk

我有一个包含以下格式的记录的文件:

SMS-MT-FSM-DEL-REP
country: IN
1280363645.979354_PFS_1_1887728354

SMS-MT-FSM-DEL-REP
country: IN
1280363645.729309_PFS_1_1084296392

SMS-MO-FSM
country: IR
1280105721.484103_PFM_1_1187616097

SMS-MO-FSM
country: MO
1280105721.461090_PFM_1_882824215

这有助于通过awk使用类似的东西进行解析:     awk'BEGIN {FS =“\ n”; RS =“”} / country:。* MO / {print $ 0}'

我的问题是如何使用awk搜索2个不同字段的记录?例如,我只想打印出具有MO国家和第一行记录的记录是SMS-MO-FSM吗?

2 个答案:

答案 0 :(得分:4)

如果你设置了FS =“\ n”,并且RS =“”,则第一个字段$ 1将是SMS-MO-FSM。因此你的awk代码是

awk 'BEGIN{FS="\n"; RS=""} $2~/country.*MO/ && $1~/SMS-MO-FSM/ ' file

答案 1 :(得分:3)

(我将此作为单独的答案而不是评论回复发布以获得更好的格式化)

关于您在单行上打印记录的第二句话:当您不修改记录时OFSORS无效。只有当您更改$0或其中一个字段awk时,才会重新计算NF并根据$0重新构建$1 OFS $2 OFS ... $NF ORS。您可以强制执行此重建:

BEGIN {
    FS  = "\n"
    RS  = ""
    OFS = ";"     # Or another delimiter that does not appear in your data
    ORS = "\n"
}
$2 ~ /^[ \t]*country:[ \t]*MO[ \t]*$/ && $1 ~ /^[ \t]*SMS-MO-FSM[ \t]*$ {
    $1 = $1 ""    # This forces the reconstruction
    print
}