【问题标题】:awk search on multiple fields of a multi line record fileawk 搜索多行记录文件的多个字段
【发布时间】:2011-03-27 05:01:34
【问题描述】:

我有一个文件,其记录格式为:

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 '开始 { FS="\n"; RS="" } /country:.*MO/ {print $0}'

我的问题是如何使用 awk 搜索 2 个单独字段的记录?例如,我只想打印出国家为 MO 且第一行是 SMS-MO-FSM 的记录?

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

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

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

    【讨论】:

    • 注意不需要的正则表达式匹配(如country: SMO)。我会尽可能使用字符串比较并锚定所有正则表达式。
    • 谢谢您,但我想知道您是否可以回答(可能是一个非常简单的)最后一个问题的补充。我想在一行上打印出结果(用于管道到 sort|uniq)> 我运行了你的代码,它工作得很好(谢谢)但是当我将 OFS 设置为“”(空格)时,记录的字段仍然出现在不同的线上。我究竟做错了什么?这是我的代码: awk 'BEGIN{FS="\n"; RS=""; OFS=" ";} $2~/country: MO$/ && $1~/SMS-MO-FSM/ {print $0}' testFile.txt
    • 管道进行排序时,您需要换行符。我不知道如何回答您的问题,因为您没有提供足够的数据信息。尝试设置 OFS="\n" 看看。
    【解决方案2】:

    (为了更好的格式,我将其作为单独的答案而不是评论回复发布)

    关于在一行上打印记录的第二条评论:当您不修改记录时,OFSORS 无效。只有当您更改$0awk 字段之一时,才会重新计算NF 并根据$1 OFS $2 OFS ... $NF ORS 重构$0。你可以像这样强制重建:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      相关资源
      最近更新 更多