【问题标题】:AWK Retrieve text after a certain pattern where the 1st and 2nd columns match the values in the 1st and 2nd columns in an input fileAWK 在特定模式后检索文本,其中第一列和第二列与输入文件中第一列和第二列中的值匹配
【发布时间】:2016-08-15 14:51:29
【问题描述】:

我的输入文件(file1)如下所示:

part position col3 col4 info
part1 34 1 1 NAME=Mark;AGE=23;HEIGHT=189
part2 55 1 1 NAME=Alice;AGE=43;HEIGHT=167
part2 19 1 1 NAME=Emily;AGE=16;HEIGHT=164
part3 23 1 1 NAME=Owen;AGE=55;HEIGHT=181
part3 99 1 1 NAME=Rachel;AGE=76;HEIGHT=162

我需要检索 info 列中“NAME=”之后的文本,但前提是前两列中的值与另一个文件 (file2) 匹配。

part position
part2 55
part3 23

然后将只考虑第 2 行和第 4 行,并将这些行中“NAME=”之后的文本放入输出文件中:

Alice
Owen

我不需要保留原始行的顺序,所以下面的输出同样有效:

Owen
Alice

我的(不是很好)尝试:

awk -F, 'FNR==NR {a[$1]=$5; next}; $1 in a {print a[$1]}' file1 file2

【问题讨论】:

    标签: awk


    【解决方案1】:

    类似的,

    awk -F"[ =;]" 'FNR==NR{found[$1" "$2]=$6; next} $1" "$2 in found{print found[$1" "$2]}'
    

    示例

    $ awk -F"[ =;]" 'FNR==NR{found[$1" "$2]=$6; next} $1" "$2 in found{print found[$1" "$2]}' file1 file2
    Alice
    Owen
    

    它有什么作用?

    • -F"[ =;]" -F 设置字段分隔符。这里我们将其设置为空格或=;。这样可以更轻松地从第一个文件中获取名称,而无需使用 split 函数。

    • found[$1" "$2]=$6这个块只对file1运行,这里我们把名字$6保存在由part position索引的关联数组found

    • $1" "$2 in found{print found[$1" "$2]} 这是针对第二个文件执行的。检查是否在数组中找到part position,如果是则打印数组中的名称

    【讨论】:

    • @JamesBrown 文件在 awk 中的顺序是否正确。在上面的例子中,file1 是文件NAME
    • 优秀的答案。但是我意识到我的文件是制表符分隔而不是空格分隔...我尝试用制表符替换命令中的空格: awk -F"[\t=;]" 'FNR==NR{found[$1'\t '$2]=$6; next} $1'\t'$2 in found{print found[$1'\t'$2]}' file1 file2 但是没有输出...
    • @HollowBastion 尝试将字段分隔符设为-F"[[:space:]=;]*"。还要确保文件的顺序,它们非常重要
    【解决方案2】:

    在下面使用gnu awk 会做同样的事情

     awk 'NR>1 &&  NR==FNR{found[$1","$2];next}\
          $1","$2 in found{print gensub(/^NAME=([^;]*).*/,"\\1","1",$NF);}' file2 file1
    

    输出

    Alice
    Owen
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2014-05-24
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多