我需要逐行比较两个文件。我只想输出那些不同的行,但是在确定差异时,应该忽略字符4-6和10-12。没有特定的字段分隔符等。
示例:
在这个例子中,只有第二行应该不同。
我不希望read循环逐行解析文件,因为这些文件有数百万条记录。
发布于 2021-09-17 19:38:21
使用GNU awk作为FIELDWIDTHS参数:
$ 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:
$ paste file[12] |
awk 'function key(s){return substr(s,1,3) substr(s,7,3)} key($1) != key($2)'
ghi456klm999 xxx000yyy000发布于 2021-09-18 02:52:19
您没有显示预期的输出,也没有真正告诉我们您的需求是什么,因此,在每个Unix框中使用任何shell中的任何awk来猜测您可能想要的是什么:
$ cat tst.awk
{ key = substr($0,1,3) substr($0,7,3) }
NR == FNR {
a[key]
next
}
!(key in a)$ awk -f tst.awk file1 file2
xxx000yyy000$ awk -f tst.awk file2 file1
ghi456klm999发布于 2021-09-17 19:35:32
这两个文件都有“数百万份记录”?选择较短的文件,读取每一行,生成一个正则表达式,以"^“(行的开头)开始,以"$”结尾(行尾)结尾,中间是搜索字符串。将要忽略的位置设置为".“(正则表达式”匹配任何单个字符“)。例如"^abc...def...$“。将其保存在临时文件(file1.tmp)中(百万?)。当您处理完所有行之后,grep -E -f file1.tmp file2将在file1.tmp中file2中搜索regexp。
https://unix.stackexchange.com/questions/669499
复制相似问题