【问题标题】:awk to compare more than two filesawk 比较两个以上的文件
【发布时间】:2014-12-24 21:34:08
【问题描述】:

想将 f11.txt 和 f22.txt 的第一个字段 ($1) 与 f33.txt 的第一个字段 ($1) 进行比较,然后打印 non-matching line items from f33.txt

f11.txt

a,b
c,d

f22.txt

a,b
x,x

f33.txt

a,b
z,z

已尝试以下命令且未完成

awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} !($1 in a) {print $0}'  f11.txt f22.txt f33.txt

f33.txt 的预期输出:

z,z

想将 f11.txt、f22.txt、f33.txt 的第一个字段 ($1) 与 f44.txt 的第一个字段 ($1) 进行比较,然后打印 non-matching line items from f44.txt

在哪里 f44.txt

m,n
x,y
b,a

已尝试以下命令且未完成

awk ' BEGIN {FS = OFS = ","} FNR==NR {a[$1] = $0; next} !($1 in a) {print $0}'  f11.txt f22.txt f33.txt f44.txt

f44.txt 的预期输出:

m,n
b,a

寻求您的建议!!

【问题讨论】:

  • nash_ag ,上面的链接仅用于比较两个文件,所以我的问题不是重复一个...
  • 你可以(在第一种情况下)从cat f11 f22 > f11_22 开始,然后使用该技术比较两个文件吗?
  • 使用 awk 链接比较多个文件和列与上述问题不相似...
  • Jas ,我这样做只是因为 Step1 是 cat f11 f22> f11_22 然后 Step2 是 f11_f22 vs f33 ,好奇要了解避免两个步骤...
  • 为避免两个步骤,您需要 awk 从前 n-1 个文件构建索引,然后仅从第 n 个(最后一个)文件打印不匹配的行。 (您当前的 awk 仅从第一个文件构建索引。)

标签: unix awk


【解决方案1】:

这里有两种可能性:

  1. 首先读取f33.txt,存储行,然后为每个后续文件删除存储的行

    awk -F, '
        NR==FNR {f33[$1]=$0; next} 
        $1 in f33 {delete f33[$1]} 
        END {for (key in f33) print f33[key]}
    ' f33.txt f11.txt f22.txt 
    
  2. 使用参数中的最后一个文件名检查当前文件

    awk -F, '
        FILENAME != ARGV[ARGC-1] {keys[$1]; next} 
        !($1 in keys)
    ' f11.txt f22.txt f33.txt 
    

【讨论】:

  • 非常感谢 Glenn Jackman 的大力支持,它工作正常,我已接受答案并投票!!!
猜你喜欢
  • 2018-03-04
  • 2012-09-05
  • 1970-01-01
  • 2017-01-31
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多