【问题标题】:If two columns from different files equal, replace third column with awk如果来自不同文件的两列相等,则将第三列替换为 awk
【发布时间】:2017-09-05 06:27:57
【问题描述】:

如果两个ID 列匹配,我正在寻找一种方法来替换文件中的列。 我有文件A.txt

c   a   b   ID
1  0.01 5   1
2  0.1  6   2
3       2   3

并归档B.txt

ID   a   b
1   10   15
2   20   16
3   30   12
4   40   14

我正在寻找的输出是 文件A.txt

ID a    b   
1  0.01 5   
2  0.1  6   
3   30  2   

我可以使用 awk 找到两个文件中的 ID 列匹配

awk 'NR==FNR{a[$1];next}$1 in a' B.txt A.txt

但是如何添加替换。感谢您的任何建议。

【问题讨论】:

  • A.txt 示例的最后一行是否有错字?它只有 2 列。
  • @HakanBaba 不,不是,文件 A 的行数可能较少
  • @RomanPerekhrest ops,我可以忽略它。对不起
  • 你的文件真的有id a c 行作为标题行吗?
  • @RomanPerekhrest 是的

标签: awk


【解决方案1】:

awk解决方案:

awk 'NR==FNR{ if(NR>1) a[$1]=$2; next }
     FNR>1 && $1 in a && NF<3{ f=$2; $2=a[$1]; $3=f }1' B.txt A.txt | column -t
  • if(NR&gt;1) a[$1]=$2; - 从文件 B.txt 中捕获列值,标题行除外 (N&gt;1)

  • FNR&gt;1 &amp;&amp; $1 in a &amp;&amp; NF&lt;3 - 如果 IDs 匹配并且来自 A.txt 的某些行少于 3 个字段


输出:

ID  a     b
1   0.01  5
2   0.1   6
3   30    2

【讨论】:

  • 如果文件A中的ID列不是第一个,我应该如何修改2部分代码?
  • @Pooh,你应该知道ID 的确切位置,因为它是一个关键字段
  • 它实际上是来自文件 B 的 $1 和来自文件 A 的 $3 :(
  • @Pooh,在这种情况下,您应该扩展描述附加条件的问题(发布新文件)
【解决方案2】:

适应您的新数据格式

awk '
   # Load file b reference
   FNR==NR && NR > 1 {ColB[$1]=$2; next}

   # treat file A
   {
   # set missing field if know in file B (and not 1st line)
   if ( NF < 4 && ( $NF in ColB) && FNR > 1) $0 = $NF FS ColB[$NF] FS $2

   # print result (in any case)
   print
   }

   #order of file is mandatory' B.txt A.txt

自我记录。 假设这只是您的示例中缺少的第二个字段

【讨论】:

    猜你喜欢
    • 2020-10-23
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2012-04-03
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多