【问题标题】:Compare two fields of two files and print if they do not match比较两个文件的两个字段,如果不匹配则打印
【发布时间】:2014-08-28 03:49:42
【问题描述】:

我有两个文件。 如果 File1 的 Column1 不执行 File2 的 Column1,则在输出文件中打印 File1 的整行。 如果两个文件的 Column1 匹配,并且如果 File1 的 Column2 的值说“N”大于“N+10”或小于“N-10”比 File2 的 Column2 的值,那么只有打印整行文件1。

文件 1:

C1  23
C1  24
C2  66
C3  88
C6  100 
C7  79
C20 200

文件2:

C1  44
C1  35
C2  70 
C4  88
C6  92
C7  90
C9  80

预期输出:

C1  23
C1  24
C3  88
C7  79
C20 200

感谢您帮助解决这个问题。 谢谢。

【问题讨论】:

  • 您尝试了哪些方法,遇到了哪些问题?为什么这被标记为 Python?
  • 您好.. 我主要是在尝试使用 awk。我标记了 Python,看看是否有使用 Python 的快速解决方案。
  • 嗯,用 Python 做起来很简单,但无论如何,你必须先发布一些代码,然后我们才能告诉你它有什么问题!
  • 我是这个领域的新手。所以我试图用awk解决第一部分。 awk '($1 != $2)' 打印$0 文件。我很抱歉代码不好。但我是初学者。

标签: python awk sed


【解决方案1】:

使用awk 你可以做到:

awk '
NR==FNR { 
    lines[NR,"col1"] = $1
    lines[NR,"col2"] = $2
    lines[NR,"line"] = $0
    next
}
(lines[FNR,"col1"] != $1) {
        print lines[FNR,"line"]
        next
}
(lines[FNR,"col2"]+10 < $2 || lines[FNR,"col2"]-10 > $2) {
        print lines[FNR,"line"]
}' file1 file2
C1  23
C1  24
C3  88
C7  79
C20 200
  • 我们读取第一个文件并创建一个多维数组,使用行号和字段作为键并适当地存储 column1、column2 和行。
  • 当我们迭代第二个文件时,我们将检查保留在适当的位置,如果它与检查点匹配,则打印该行。

【讨论】:

  • awk 是一个非常强大的工具。
  • 非常感谢。有效。我正在使用这段代码。干杯!
【解决方案2】:

由于您只有两列,我建议使用paste 合并它们,这将使awk 的逻辑更容易:

paste file1 file2 | awk '{ if($1 != $3){print $1,$2}else if($4 > ($2 + 10) || $4 < ($2 -10 )){print $1,$2} }'
C1 23
C1 24
C3 88
C7 79
C20 200

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 2017-07-30
    • 2021-06-26
    • 1970-01-01
    • 2016-10-23
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多