linux shell脚本攻略中,通过md5sum来查找出文件夹中的重复文件问题?
以下是我的程序:#!/bin/bashls-lS|awk'BEGIN{getline;getline;name1=$9;size=$5}{name2=$9;if(size...
以下是我的程序:
#!/bin/bash
ls -lS | awk 'BEGIN {
getline;getline;
name1=$9; size=$5
}
{ name2=$9;
if (size==$5)
{
"md5sum "name1 | getline;print $1;
"md5sum "name2 | getline;print $1;
}
size=$5;
name1=name2;
}'
输出是这样的:
[root@holdon script]# ./removeduplicate.sh
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test01
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test02
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test03
改成下面的样子:
#!/bin/bash
ls -lS | awk 'BEGIN {
getline;getline;
name1=$9; size=$5
}
{ name2=$9;
if (size==$5)
{
print name1;
print name2;
}
size=$5;
name1=name2;
}'
输出是这样的:
[root@holdon script]# ./removeduplicate.sh
test
test01
test01
test02
test02
test03
想请教一下,为什么改成"md5sum "name1 | getline;print $1;后,test01就只会输出一次,理论上应该test和test01比一次,test01和test02比一次,输出两次才对。 展开
#!/bin/bash
ls -lS | awk 'BEGIN {
getline;getline;
name1=$9; size=$5
}
{ name2=$9;
if (size==$5)
{
"md5sum "name1 | getline;print $1;
"md5sum "name2 | getline;print $1;
}
size=$5;
name1=name2;
}'
输出是这样的:
[root@holdon script]# ./removeduplicate.sh
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test01
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test02
84e1ed4b823fe3cb6ea2ab3bd8c806a1 test03
改成下面的样子:
#!/bin/bash
ls -lS | awk 'BEGIN {
getline;getline;
name1=$9; size=$5
}
{ name2=$9;
if (size==$5)
{
print name1;
print name2;
}
size=$5;
name1=name2;
}'
输出是这样的:
[root@holdon script]# ./removeduplicate.sh
test
test01
test01
test02
test02
test03
想请教一下,为什么改成"md5sum "name1 | getline;print $1;后,test01就只会输出一次,理论上应该test和test01比一次,test01和test02比一次,输出两次才对。 展开
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行,中间有重复
你的程序上面那个,由于在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行,中间有重复
追问
我在网上看到的信息是,当getline接了重定向符号|或者>时,它的功能就不是改变当前行的NR值了,只是起一个重定向的作用,不会跳行啊。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询