首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较两个没有分隔符的文件的特定位置

如何比较两个没有分隔符的文件的特定位置
EN

Unix & Linux用户
提问于 2021-09-17 18:46:19
回答 4查看 403关注 0票数 -4

我需要逐行比较两个文件。我只想输出那些不同的行,但是在确定差异时,应该忽略字符4-6和10-12。没有特定的字段分隔符等。

示例:

  • 文件1 abc123def999 ghi456klm999 nop789qrs999
  • 文件2 abc000def000 xxx000yyy000 nop000qrs000

在这个例子中,只有第二行应该不同。

我不希望read循环逐行解析文件,因为这些文件有数百万条记录。

EN

回答 4

Unix & Linux用户

发布于 2021-09-17 19:38:21

使用GNU awk作为FIELDWIDTHS参数:

代码语言:javascript
复制
$ paste file[12] |
    awk -v FIELDWIDTHS='3 3 3 3 1 3 3 3 3' '$1!=$6 || $3!=$8'
ghi456klm999    xxx000yyy000

在这里,我们使用paste命令并行粘贴两个文件;然后假设两个文件中的行都是固定长度,因为我们使用awk的FIELDWIDTHS参数来定义字段长度,然后比较相关字段的差异;下面是逐行比较。

或者在任何壳中使用任何awk:

代码语言:javascript
复制
$ paste file[12] |
    awk 'function key(s){return substr(s,1,3) substr(s,7,3)} key($1) != key($2)'
ghi456klm999    xxx000yyy000
票数 4
EN

Unix & Linux用户

发布于 2021-09-18 02:52:19

您没有显示预期的输出,也没有真正告诉我们您的需求是什么,因此,在每个Unix框中使用任何shell中的任何awk来猜测您可能想要的是什么:

代码语言:javascript
复制
$ cat tst.awk
{ key = substr($0,1,3) substr($0,7,3) }
NR == FNR {
    a[key]
    next
}
!(key in a)
代码语言:javascript
复制
$ awk -f tst.awk file1 file2
xxx000yyy000
代码语言:javascript
复制
$ awk -f tst.awk file2 file1
ghi456klm999
票数 1
EN

Unix & Linux用户

发布于 2021-09-17 19:35:32

这两个文件都有“数百万份记录”?选择较短的文件,读取每一行,生成一个正则表达式,以"^“(行的开头)开始,以"$”结尾(行尾)结尾,中间是搜索字符串。将要忽略的位置设置为".“(正则表达式”匹配任何单个字符“)。例如"^abc...def...$“。将其保存在临时文件(file1.tmp)中(百万?)。当您处理完所有行之后,grep -E -f file1.tmp file2将在file1.tmpfile2中搜索regexp。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/669499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档