一段awk代码的疑问

发布于 2021-11-25 00:12:45 字数 1732 浏览 951 评论 4


ls -lS 当前目录文件如下:

total 24
-rwxr-xr-x 1 root root 463 Dec 11 21:34 remove_duplication.sh
-rw-r--r-- 1 root root 248 Dec 11 20:12 other
-rw-r--r-- 1 root root   6 Dec 11 20:10 test
-rw-r--r-- 1 root root   6 Dec 11 20:11 test_copy1
-rw-r--r-- 1 root root   6 Dec 11 20:11 test_copy2
-rw-r--r-- 1 root root   6 Dec 11 20:11 test_copy3



test和test_copy1, test_copy2,test_copy3内容一样,打算做一个去重的脚本,将内容重复的文件找出来,

是用awk做的,还没写完,但是发现了一些疑问

去重脚本如下(还未完成):

#! /bin/bash

ls -lS | awk 'BEGIN{
    getline;getline
    size=$5; lastName=$9
}

{
    currentName=$9
    if(size==$5) {
        "md5sum "lastName | getline;  csum1=$1;
        "md5sum "currentName | getline; csum2=$1;     
        if(csum1==csum2) {
            print lastName
            print currentName                             
        }
    };
    size=$5
    lastName=currentName       

} '



最终打印出的结果是:

test
test_copy1
test_copy2
test_copy3



结果显示这几个文件都是内容重复的,但是有个疑问为什么结果不是这样的??

test
test_copy1
test_copy1
test_copy2
test_copy2
test_copy3



因为执行到第三行的时候test和test_copy1比较了,相同于是把两个文件名都打印了,

之后将当前的名字test_copy1赋给lastName,下一个循环继续比较,也就是test_copy2和test_copy1这两个应该满足条件,也就是test_copy1会被重复打印一遍,但是这里却没有,不知道为什么?





如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

檐上三寸雪 2021-11-30 21:34:45

因为awk的代码段会执行每一行;

而在代码段中若调用getline就会继续读取一样,实际读取两行;

沦落红尘 2021-11-30 05:57:10

恩,你这个方式也不错,但是我想问的是,为什么我那个写最后结果不是这样的? test test_copy1 test_copy1 test_copy2 test_copy2 test_copy3 按我理解应该test_copy1会被重复打印,但是却没有为什么呢?

无声静候 2021-11-27 21:01:10

回复
建议看一下getline的用法 http://bbs.chinaunix.net/thread-108596-1-1.html 我感觉是getline以后会覆盖 $1,$5等等这些变量。

一人独醉 2021-11-27 09:13:02

用awk的数组

#!/bin/sh

#md5sum 算出所有的hash
#把hash相同的放到一个数组中
md5sum * | awk '{
	if($1 in a){
		a[$1]=a[$1]" "$2;
	}
    else{
		a[$1]=$2;
	}}
	END{
    for( i in a ){
		print a[i]
	}
}'

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文