,因此相当于已经跳到下一行了。你的程序上面那个,由于在awk中有多次getline,因此一开始把记录定位到第二行,即第一个文件,然后每调用一次"md5sum ""og:type" content="webpage">,因此相当于已经跳到下一行了。你的程序上面那个,由于在awk中有多次getline,因此一开始把记录定位到第二行,即第一个文件,然后每调用一次"md5sum "" /> ,因此相当于已经跳到下一行了。你的程序上面那个,由于在awk中有多次getline,因此一开始把记录定位到第二行,即第一个文件,然后每调用一次"md5sum ""> linux shell脚本攻略中,通过md5sum来查找出文件夹中的重复文件问题?_系统运维_内存溢出

阅读 3

linux shell脚本攻略中,通过md5sum来查找出文件夹中的重复文件问题?,第1张

getline函数调用时,awk将会把下一条记录读入赋值给$0,因此相当于已经跳到下一行了。你的程序上面那个,由于在awk中有多次getline,因此一开始把记录定位到第二行,即第一个文件,然后每调用一次"md5sum "name1 | getline记录就跳到了下一行,输出是不会重复

的。

而下面的那个程序,没有多次getline调用,awk按行扫描,每次会把当前行的文件名赋值给name2,同时name1又记录了上一次的文件名,因此出现了test01两次,test02两次

事实上,输出和扫描行的对应关系是:

先在BEGIN段跳过两行,当前行为test,name赋值得到test

然后逐行扫描,当前扫描行是test01时, 输出了test test01

当前扫描行是test02时, 输出了 test01 test02

当前扫描行是test02时, 输出了 test02 test03

所以一共出现6行,中间有重复通常如果我们想获取一个文件里不重复的行的时候,我们可以直接通过 sort -u 命令

,先把文件排序,然后去掉连续的重复行就行。

可是,如果我们去掉重复行之后,还想保留文件原有的顺序,该怎么办呢?

虽然 Linux 下有个看上去似乎很有用的命令叫uniq,但事实上 uniq 命令仅仅只对连续的重复行有效。

如果不排序,直接使用 uniq 命令是没有用的;使用 sort -u 的话,我们就丢失了文件原有的行的顺序了。

一个终极的解决方案是使用 awk:

简要解释一下:awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行。

我们这里写的 awk 命令是!x[$0]++,意思是,首先创建一个 map 叫x,然后用当前行的全文$0作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。

由于表达式之后有++,因此如果某个 key 找不到对应的 value,该++ *** 作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了。

我们前面说过,awk 的流程是先判断表达式,表达式为真的时候就执行语句,可是我们前面写的这个 awk 命令里只有表达式,没有语句,那我们执行什么呢?原来,当语句被省略的时候,awk 就执行默认的语句,即打印整个完整的当前行。就这样,我们通过这个非常简短的 awk 命令实现了去除重复行并保留原有文件顺序的功能。

第一,用sort+uniq,注意,单纯uniq是不行的。

第二,用sort+awk命令,注意,单纯awk同样不行,原因同上。

第三,用sort+sed命令,同样需要sort命令先排序。

以上原理都是上下行比对,如果中间开了几行,uniq就不生效

例如:

111

222

111

是不能正确排序的,必须是:

111

111

222


uniq才会生效,所以都需要先用sort 来排序,然后将结果输出到其他文件。

欢迎分享,转载请注明来源:

内存溢出

原文地址:

http://outofmemory.cn/yw/8989273.html
输出
(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
wj wj 一级用户组
linux系统如何连接有线
上一篇
2023-04-23
linux系统怎么安装?
2023-04-23

发表评论
请登录后评论... 登录
提交

    评论列表(0条)
保存
{label} {label} ,因此相当于已经跳到下一行了。你的程序上面那个,由于在awk中有多次getline,因此一开始把记录定位到第二行,即第一个文件,然后每调用一次"md5sum "', author : 'wj', cat_name : '系统运维', time_y_m : '2023年04月', time_d : '23', site_motto : '内存溢出' }; {script} {script}