【问题标题】:compare two files (understanding)比较两个文件(理解)
【发布时间】:2016-10-12 22:24:11
【问题描述】:

我试图了解来自不同文件的两个字段的 awk 比较。 (所有文件都用制表符分隔)

第一个文件:

1   11796321
1   169549811
1   173917078
2   48962782
4   121696962
4   121697011

第二个文件:

a 0 1 2 0 b 1 11796321 a
b 0 1 0 2 c 1 11800000 bd
c a d 0 0 2 4 121696962 0

输出:

 b 0 1 0 2 c 1 11800000 bd

所以我想将第一个文件中的 $1 和第二列与第二个文件中的第 7 列和第 8 列进行比较并打印不匹配。

我试过了:

awk -v OFS="\t" -F '\t' 'FNR==NR{a[$1,$2]; next} ($7,$8) in a {next} {print $0}' file1 file2 

您能否帮助了解错误在哪里以及如何比较这些文件? 谢谢你。

【问题讨论】:

  • 您发布的脚本没有任何问题,它会按照您所说的在任何 POSIX awk 中运行。它在哪些方面不适合您?

标签: awk compare


【解决方案1】:

如果两个文件中的分隔符相同(<tab>),你可以试试这个:

awk -F '\t' 'FNR==NR{k=$1 FS $2;a[k];next} !($7 FS $8  in a)' file1 file2 

【讨论】:

  • 完美运行。所以一开始我要定义k,FS(\t)在哪里,放到数组a中,数组a是k定义的,然后比较……对吗?
  • @fedulka 你能报告一下你首先使用的是哪个 awk 版本吗?
  • awk 版本 4.0.1
  • @fedulka 如果是 gnu-awk(gawk) 4.0 应该已经支持数组数组,这意味着您的代码应该可以工作。如果你的 awk 不是 gawk,或者低于 4,它就不起作用。
  • 此页面上没有任何特定于 gawk 的内容(到目前为止)。没有人使用数组数组(真正的多维数组),问题和所有当前答案都使用所有 awk 版本支持的伪多维数组。
【解决方案2】:

改成

$ awk -v OFS="\t" -F'\t' 'FNR==NR{a[$1,$2]; next} !(($7,$8) in a)' file1 file2

【讨论】:

  • 谢谢,您的脚本运行良好。总是有效。谢谢
  • 你没有使用OFS所以不需要设置它。
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 2022-01-04
  • 2018-03-04
  • 2011-04-21
相关资源
最近更新 更多