【问题标题】:Get Value from file by key file using awk使用 awk 通过密钥文件从文件中获取值
【发布时间】:2021-10-19 08:53:06
【问题描述】:

我对 awk 有点陌生,我正在尝试使用另一个文件中的键从文件中获取值。

价值文件:

1   39485063845911  RANDOMTEXT    RANDOMNUMBERS
1   39485063845912  RANDOMTEXT    RANDOMNUMBERS
1   39485063845913  RANDOMTEXT    RANDOMNUMBERS
1   39485063845914  RANDOMTEXT    RANDOMNUMBERS

密钥文件:

1   39485063845911  RANDOMTEXT
1   39485063845912  RANDOMTEXT

我试图调整我以前的 awk,但无法完成工作

awk 'BEGIN {FIELDWIDTHS="7 14 3 28 3 25"} NR==FNR {data["0"$14];next} NR!=FNR {FIELDWIDTHS="7 14 3 28"} {if(!($14) in data) {print $0}}' file

FIELDWIDTHS 中的数字“代表”列的宽度(都是位置文件),$14 是键列的宽度

所以上面例子的输出文件应该是:

1   39485063845911  RANDOMTEXT    RANDOMNUMBERS
1   39485063845912  RANDOMTEXT    RANDOMNUMBERS

【问题讨论】:

标签: awk


【解决方案1】:

您的代码,为了清楚起见带有换行符:

awk '
    BEGIN {FIELDWIDTHS="7 14 3 28 3 25"}
    NR==FNR {data["0"$14];next}
    NR!=FNR {FIELDWIDTHS="7 14 3 28"}
   {if(!($14) in data) {print $0}}
' file
  1. 您在第二个(或以后)文件的每一行设置FIELDWIDTHS,而不是只设置一次 - 这是低效的
  2. 您只读取一个文件,因此不会打印任何内容
  3. 您似乎认为 $14 在某种程度上与长度为 14 的字段相关
  4. 如果您想从值文件中打印与密钥文件中的记录匹配的记录,您似乎已经否定了您将使用的测试(您应该执行if (x in y) 而不是if (!(x in y))

也许你需要类似的东西:

gawk '
  FNR==1 { FIELDWIDTHS = NR==FNR ? "7 14 3 28" : "7 14 3 28 3 25" }
  NR==FNR { keys[$2]++; next }
  $2 in keys  { print }
' keyfile valuefile

这个:

  • 每个输入文件只设置一次FIELDWIDTHS
  • 同时使用密钥文件和值文件
  • 指的是字段 2 ($2),这似乎是您希望成为关键的字段
  • 测试存在而不是不存在
  • 明确使用gawk 而不是awk 以避免令人讨厌的意外(如果使用了不支持非POSIX FIELDWIDTHS 的版本)

【讨论】:

  • 您应该提到 FIELDWIDTHS 需要 GNU awk。
【解决方案2】:

我知道您在问题中谈论的是 FIELDWIDTHS 和字符位置,但您还说“我对 awk 有点陌生”并且您的脚本中有几个初学者错误,因此您可能不完全了解如何使用它并给出你提供的所有你真正需要的例子是:

$ awk 'NR==FNR{a[$2]; next} $2 in a' key values
1   39485063845911  RANDOMTEXT    RANDOMNUMBERS
1   39485063845912  RANDOMTEXT    RANDOMNUMBERS

如果这还不是您所需要的,那么编辑您的问题以提供更真实的示例输入/输出,包括上述不起作用的情况。

【讨论】:

    【解决方案3】:

    或者加入第三种可能性,这可以像grep -f 一样简单。例如:

    grep -f keyfile valuefile
    

    注意:这要求分隔两个文件之间值的空格匹配。如果不匹配,则基于awk 字段的方法是合适的)

    使用 keyfile 中的行匹配 valuefile。

    使用/输出示例

    对于你上面的例子:

    $ grep -f keyfile valuefile
    1   39485063845911  RANDOMTEXT    RANDOMNUMBERS
    1   39485063845912  RANDOMTEXT    RANDOMNUMBERS
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多