【问题标题】:Joining two files with multiple columns via AWK通过 AWK 连接具有多列的两个文件
【发布时间】:2014-01-22 16:50:17
【问题描述】:

首先,我必须道歉:我知道有很多不同的话题已经回答了我的问题,但你自己会看到,AWK 并不是我真正的好朋友。

你们都知道这个故事,对吧? ;) “嘿,随机员工,你是被选中的人!我需要你学习这个我们都不知道的奇怪东西。你的截止日期是明天,祝你好运!”

我不会再抱怨它了(承诺!:p),但经过多次尝试,我无法真正理解关于 AWK 的所有内容(谁说“一件事”?)。

所以,这是我的问题!

我有两个文件,包含以下列:

文件 A.txt:

A B C D E F G H

文件 B.txt:

A C F I

我想通过将这两个文件合并到另一个文件中来获得以下输出:

输出文件 C.txt:

A B C D E F G H I

我想在它们之间进行连接,将“I”添加到已存在的具有 A、C 和 F 列的行中,并删除其他行。

到目前为止,我知道我必须使用这样的东西:

awk '
    FNR==NR{Something ;next}
    {print $0}
' A.txt B.txt

是的,我知道。一开始听起来很糟糕。

那里有英雄吗?

【问题讨论】:

  • 我们会一直考虑 A.txt 中的第 1、第 3 和第 6 列吗?或者只是来自 B.txt 的行在 A.txt 的某行中的任何位置有 3 个值?如果 B.txt 包含 A B C J 怎么办?
  • 感谢您的快速回复!编辑:抱歉,没有看到您编辑了您的评论。最后,我们需要每一行匹配文件B第1、2和3列的第1、3和6列。为了解释我自己,B.txt只有4列,而A.txt有8列。
  • 请参阅stackoverflow.com/questions/5467690/…。似乎是非常相似的问题。

标签: awk


【解决方案1】:
awk '
    NR==FNR {A[$1,$3,$6] = $0; next} 
    ($1 SUBSEP $2 SUBSEP $3) in A {print A[$1,$2,$3], $4}
' A.txt B.txt

这需要将整个文件 A.txt 存储在内存中。如果 B.txt 明显更小

awk '
    NR==FNR {B[$1,$2,$3] = $4; next}
    ($1 SUBSEP $3 SUBSEP $6) in B {print $0, B[$1,$3,$6]}
' B.txt A.txt

【讨论】:

  • @Jordan.lamarche:你知道:只有在第一个文件的第一遍(FNR=读当前文件或标准输入。NR= 到目前为止读取的记录(或行)总数,在所有文件/输入中)。所以它允许 glenn 分离第一个文件的读取(然后创建 A[] 数组,然后“下一个”不做以下几行),并且在第二个文件上,它绕过第一行(因为 NR 只能是 > FNR),所以它会完成其余的工作。
猜你喜欢
  • 1970-01-01
  • 2012-10-26
  • 2018-07-15
  • 1970-01-01
  • 2021-11-21
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多