linux文本排序、交集、差集,查找并删除重复文件脚本、comm命令
来源:互联网 发布:江阴网络女主播被杀 编辑:程序博客网 时间:2024/05/19 01:09
comm 命令
comm命令可用于两个文件之间的比较。通过参数调整输出,可以执行交集、求差以及差集操作。- 交集:打印出两个文件所有共同的行。- 求差:打印出指定文件所包含的互不相同的那些行。- 差集:打印出包含在文件A中,但不包含在其他指定文件中的那些行。
需要注意的是,comm必须使用经过排序的文件作为输入。在linux中可以使用
sort
命令实现排序。
comm实战
建立两个文本文件输入以下内容:
cat A.txtappleorangegoldsilversteeliron
cat B.txtorangegoldcookiescarrot
此时两个文件内的文本是乱序的,使用sort
进行排序。
sort [option] [file] 参数 -o 要输出的文件。
sort A.txt -o A.txt;sort B.txt -o B.txt;
(1) 首先执行不带任何选项的comm:
$ comm A.txt B.txtapple carrot cookies goldiron orangesilversteal
输出的第一列包含中在A.txt中的行,第二列包含只在B.txt中出现的行,第三列包含同时包含两文件中相同的行。各列使用\t
分隔。
(2) 为了打印两个文件的交集,我们需要删除第一列和第二列,只打印第三列:
$ comm A.txt B.txt -1 -2goldorange
(3) 打印出两个文件中不相同的行:
$ comm a.txt b.txt -3apple carrot cookiesironsilversteal
(4) 为了提高输出结果的可用性,需要删除空白字段,将两列合并成一列:
借助sed
命令格式化输出。
sed - stream editor for filtering and transforming text 字符流编辑
$ comm a.txt b.txt -3 | sed 's/^\t//'applecarrotcookiesironsilversteal
sed 命令解释: sed命令通过管道获取comm的输出。它删除行首的
\t
字符。sed中的s表示替换substitute
。/^\t/匹配行前的\t
(^是行首标记).//
是用来替换行首的/t的字符串。如此一来,就可以删除所有行首的\t.
查找并删除重复文件
这里重复文件指文本内容相同的文件,我们可以借助校验和md5sum
命令进行校验。
(1) 创建测试文件
$ echo "hello" > test;$ cp test test_cp1;$ cp test test_cp1;$ echo "next" > other;
(2) 编写脚本文件
# !/bin/bash# 文件名: remove_dupliates.sh# 描述:查找当前目录下重复文件,删除ls -lS --time-style=long-iso | awk 'BEGIN { getline;getline; name1=$8;size=$5}{ name2=$8; if(size==$5){ "md5sum "name1 | getline; csum1=$1; "md5sum "name2 | getline; csum2=$1; if(csum1==csum2){ print name1;print name2 } }; size=$5; name1=name2;}' | sort -u > duplicate_filescat duplicate_files | xargs -I {} md5sum {} | sort | uniq -w 32 | awk '{ print "^"$2"$" }' | sort -u > duplicate_sampleecho Removing...comm duplicate_files duplicate_sample -2 -3 | tee /dev/stderr | xargs rm echo Removed duplicated files successfully.
此shell工作原理。ls -lS 对当前目录所有文件按照文件大小进行排序,并列出文件的详细信息。awk读取ls -lS的输出,对行列进行比较,找出重复文件。
执行逻辑:
将文件依据大小排序并列出,这样大小相近的文件会排列在一起。识别大小相同的文件是我们查找重复文件的第一步。接下来,计算这些文件的校验和。如果校验和相同,那么这些文件就是重复文件,将被删除。
在从文件中读取文本行之前,首先要执行awk(awk是一个强大的文本分析工具)的BEGIN{}语句块.读取文本的工作在{}语句中进行,读取并处理的忣的行后,执行END{}语句块。
使用
$1
,$2
,$3...$n
中获取命令输出中的每一列。我们将文件的md5sum保存在变量csum1和csum2中。变量name1和name2保存文件列表中位置连续的文件名。如果两个文件的校验和相同,那它们肯定是重复文件,其文件名会被打印出来。
- linux文本排序、交集、差集,查找并删除重复文件脚本、comm命令
- linux:使用comm命令比较两个文件:交集、差
- comm命令:文件的交集与差集
- linux 文本文件的交集,差集 comm命令
- [Shell]comm 交集 差集
- linux shell, 三行命令:查找并删除重复的文件
- linux命令求两个文件的交集、差集、并集等
- linux求两个文件的交集,并集,差集
- linux文件交集差集
- linux文件交集差集
- linux文件交集差集
- shell脚本---查找并删除重复的文件
- node,javascript数组排序,去重复,并集,交集,差集
- Linux 求文件交集 差集等
- SQL 并集、差集、交集、结果集排序
- linux shell下求文件的交集、并集、差集
- Linux shell计算两个文件的交集,并集和差集
- 交集 并集 差集
- Android开发之Service
- LeetCode | Best Time to Buy and Sell Stock
- linux发布war包应用的常用命令
- primary和unique的区别
- Qt5 发布程序
- linux文本排序、交集、差集,查找并删除重复文件脚本、comm命令
- 使用is和as关键字
- oc学习之Foundation框架--装箱和拆箱
- 数据结构实验之排序七:选课名单
- linux磁盘配额
- 工作笔记-页面样式部分
- JavaScript-如何实现数组的随机排序?
- 如何有效学习iOS?
- linux磁盘逻辑卷的安装