linux中怎么按条件去重一个linux文件内容去重

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
用 shell 处理一个文本文件,内容如下:
根据第一列去重,相同的保留第二列值最大的那个,结果数据应该是这样的:
看了下 uniq 命令,好像不支持按字段去重。请问该如何去重呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
cat data.txt | sort -rnk2 | awk '{if (!keys[$1]) print $0; keys[$1] = 1;}'
先按照第二列逆序排列,保证数字从大到小输出,然后再用 awk,只有第一列的字符串第一次出现才输出这个字符串,其他的丢弃,这样应该就可以解决问题了。但是这种方法可能会让 awk 占用很多的内存,文件过大的话有问题。
cat data.txt | sort -k1,1 | awk '{
if (lastKey == $1) {
if (lastValue & $2) {
lastLine = $0;
lastValue = int($2);
if (lastLine) {
print lastL
lastKey = $1;
lastLine = $0;
lastValue = int($2);
if (lastLine) {
print lastL
这个方案是按照第一列排序,然后用 awk 筛选结果,筛选的过程相当于一个加强版的 uniq。这个方案在内存使用方面好了很多,不过代码量略多,不是很简洁。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
$ sort -r a.txt | awk '{print $2, $1}' | uniq -f1 | awk '{print $2, $1}'
逆排, 反转第一列和第二列, 按第二列去重, 反转第一列和第二列
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
'BEGIN{ a[$1]=$2 }{ if ($2&a[$1] )
}END{for (i in a) if (i)
print i,a[i]}' data.txt
把第一列放入数组 然后对比数组的值
大的就替换掉为新的值
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
~$ echo -e 'fdf
547' | sort -r | sort -k1,1 -u
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
[root@localhost ~]# sort -k2r 1.txt|awk '!a[$1]++'
该答案已被忽略,原因:
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。Linux下删除重复文件的神器:dupeGuru_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Linux下删除重复文件的神器:dupeGuru
来源:Linux中国&
作者:Linux
最近,我需要清理我父亲的文件和文件夹。有一个难题是,里面存在很多不正确的名字的重复文件。有移动硬盘的备份,同时还为同一个文件编辑了多个版本,甚至改变的目录结构,同一个文件被复制了好几次,名字改变,位置改变等,这些文件挤满了磁盘空间。追踪每一个文件成了一个最大的问题。万幸的是,有一个小巧的软件可以帮助你省下很多时间来找到删除你系统中重复的文件:。它用Python写成,这个去重软件几个小时前切换到了GPLv3许可证。因此是时候用它来清理你的文件了!
dupeGuru的安装
在上, 你可以加入如下硬编码的软件PPA:
$ sudo apt-add-repository ppa:hsoft/ppa
$ sudo apt-get update
接着用下面的命令安装:
$ sudo apt-get install dupeguru-se
在ArchLinux中,这个包在中。
如果你想自己编译,源码在上。
dupeGuru的基本使用
DupeGuru的构想是既快又安全。这意味着程序不会在你的系统上疯狂地运行。它很少会删除你不想要删除的文件。然而,既然在讨论文件删除,保持谨慎和小心总是好的:备份总是需要的。
你看完注意事项后,你可以用下面的命令运行duprGuru了:
$ dupeguru_se
你应该看到要你选择文件夹的欢迎界面,在这里加入你你想要扫描的重复文件夹。
一旦你选择完文件夹并启动扫描后,dupeFuru会以列表的形式显示重复文件的组:
注意的是默认上dupeGuru基于文件的内容匹配,而不是他们的名字。为了防止意外地删除了重要的文件,匹配列列出了其使用的匹配算法。在这里,你可以选择你想要删除的匹配文件,并按下&Action& 按钮来看到可用的操作。
可用的选项相当广泛。简而言之,你可以删除重复、移动到另外的位置、忽略它们、打开它们、重命名它们甚至用自定义命令运行它们。如果你希望删除重复文件,你可能会像我一样非常意外竟然有这么多种删除方式。
你不仅可以将删除的文件移到垃圾箱或者永久删除,还可以选择留下指向原文件的链接(软链接或者硬链接)。也就是说,重复文件将会删除文件存储,但是会保留下一个指向原文件的链接。这将会省下大量的磁盘空间。如果你将这些文件导入到工作空间或者它们有一些依赖时很有用。
还有一个奇特的选项:你可以用HTML或者CSV文件导出结果。我不确定你会不会需要这么做,但是我假设你想追踪重复文件而不是想让dupeGuru处理它们时会有用。
最后但并不是最不重要的是,偏好菜单可以让你按照你的想法来操作去重这件事。
这里你可以选择扫描的标准,基于内容还是基于名字,并且有一个阈值来控制结果的数量。这里同样可以定义自定义在执行中可以选择的命令。混在其他那些小的选项中,要注意的是dupeGuru默认忽略小于10KB的文件。
要了解更多的信息,我建议你到看下,这里有很多文档、论坛支持和其他好东西。
总结一下,dupeGuru是我无论何时准备备份或者释放空间时所想到的软件。我发现这对高级用户而言也足够强大了,对新人而言也很直观。锦上添花的是:dupeGuru是跨平台的,这意味着你可以在Mac或者在Windows PC上都可以使用。如果你有特定的需求,想要清理音乐或者图片。这里有两个变种:和 , 相应地可以清理音频和图片文件。与常规版本的不同是它不仅比较文件格式还比较特定的媒体数据像质量和码率。
你觉得dupeGuru怎么样?你会考虑使用它么?或者你有任何可以替代的软件的建议么?让我在评论区知道你们的想法。
本文永久更新链接地址:
相关资讯 & & &
& (03/05/:49)
& (06/02/:45)
& (01/07/:13)
& (08/09/:41)
& (03/30/:00)
& (09/28/:11)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款shell 中某个字段重复怎么去重_百度知道
shell 中某个字段重复怎么去重
我有更好的答案
uniq命令!
使用sort -u可去重
为您推荐:
其他类似问题
shell的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。如何使用shell脚本快速排序和去重文件数据 - Linux编程 - 次元立方网 - 电脑知识与技术互动交流平台
如何使用shell脚本快速排序和去重文件数据
  前面写过一篇通过shell脚本去重10G数据的文章,见《用几条shell命令快速去重10G数据》。然而今天又碰到另外一个业务,业务复杂度比上次的单纯去重要复杂很多。找了很久没有找到相应的办法,于是用shell脚本程序去处理。具体业务逻辑:
  1、首先根据给定指定进行排序
  2、排序后对给定字段进行去重,去重的规则如下:
    a)排序后如果相邻N行给定字段值相同的行数不超过两行,则两行都保留。
    a)排序后如果相邻N行给定字段值相同的行数超过两行,则保留首行和尾行。
  就这样一个业务逻辑,其实看起来并不是太难。但是问题来了,怎么才能在10~20G的数据中快速地进行处理呢?网上找了很久没找到相应的处理办法,于是先用一种相对笨的办法实现。
  测试数据:
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
A0223EE1IDJDJBE,55 ,OQQQQ54,876F0,271202,ss
A0223EE1IDJDJBE,55 ,OQQQQ54,876F0,271202,ss
  shell脚本:
if [ '$#' != '2' ]; then
echo 'Usage: 参数1:文件路径,参数2:文件名。'
#源文件所在目录
filepath=$1
#源文件绝对路径
orgfile=$filepath'/'$2
#合并字段后的临时文件
#mergerfile='$orgfile'_merge.txt
#排序后的临时文件
sortfile='$orgfile'_sort.txt
#最终结果文件
result_unique='$orgfile'_result_unique.txt
echo ''&$result_unique
#echo '文件:$orgfile'
#echo '开始合并字段...'
#awk 'BEGIN{ FS=',';}{ print $1','$2','$3','$4','$5','$6','$7','$1$3$4 }' $orgfile & $mergerfile
#echo '字段合并结束...'
echo '文件排序 start...'
#sort -t $',' -k 1,1 -k 9,9 $mergerfile &$sortfile
sort -t $',' -k 1,2 $orgfile &$sortfile
echo '文件排序 end...'
printf '***********文件比较 start**************************
echo 'while read line &$sortfile'
firstline=''
lastline=''
#上一次比较的key
lastKey=''
linecount=`sed -n '$=' $sortfile`
echo 'linecount=========&&&&&&&$linecount'
while read line || [[ -n '$line' ]];
#合并需要比较的字段
compare=`echo '$line'|awk -F ',' '{print $1$3$4}'`
echo 'compare=====$compare'
#判断字符串是否相等
if [ '$i' != '$linecount' -a '$lastKey' = '$compare' ];then
echo '[ = ]'
cnt=$(expr $cnt + 1)
lastline='$line'
if [ '$firstline' = '' ];then
firstline=$line
#echo '$firstline' && $result_unique
#echo '----$i----------------&&&&&&&&&&&$cnt'
if [ $cnt -gt 1 -o '$i' == '$linecount' ];then
echo '----$i----------------&&&&&&&&&&&$cnt'
if [ '$i' != '$linecount' -a '$lastline' != '' ];then
echo '$lastline' && $result_unique
echo '$line' && $result_unique
# 最后一行的特殊处理
if [ '$i' == '$linecount' ];then
echo '================last line==================='
echo '$line' && $result_unique
firstline='$line'
lastline='$line'
elif [ $cnt -eq 1 ];then
firstline=$line
lastline='$line'
echo '$lastline' && $result_unique
lastKey='$compare'
done &$sortfile
echo '*******************文件 $orgfile 处理结束***************************'
echo '*******************结果文件 $result_unique ***************************'
  给脚本添加执行权限:
chmod +x uniquefile.sh
  执行shell脚本
sh ./uniquefile.sh ./文件路径 文件名
  结果:
[root@xddsdsdsddssd ~]# sh uniquefile.sh ./ testfile.csv
文件排序 start...
文件排序 end...
***********文件比较 start**************************
while read line &.//testfile.csv_sort.txt
linecount=========&&&&&&&6
A0223EE1IDJDJBE,55 ,OQQQQ54,876F0,271202,ss
compare=====A0223EE1IDJDJBEOQQQQ54876F0
A0223EE1IDJDJBE,55 ,OQQQQ54,876F0,271202,ss
compare=====A0223EE1IDJDJBEOQQQQ54876F0
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
compare=====F250A4FFIDJDJE7OQQQQB88769E
----3----------------&&&&&&&&&&&2
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
compare=====F250A4FFIDJDJE7OQQQQB88769E
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
compare=====F250A4FFIDJDJE7OQQQQB88769E
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
compare=====F250A4FFIDJDJE7OQQQQB88769E
----6----------------&&&&&&&&&&&3
================last line===================
*******************文件 .//testfile.csv 处理结束***************************
*******************结果文件 .//testfile.csv_result_unique.txt ***************************
  最终结果文件:
[root@wewewwew ~]# more testfile.csv_result_unique.txt
A0223EE1IDJDJBE,55 ,OQQQQ54,876F0,271202,ss
A0223EE1IDJDJBE,55 ,OQQQQ54,876F0,271202,ss
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
F250A4FFIDJDJE7,48 ,OQQQQB8,26,,ss
  时间比较赶,先这样实现吧。哪位亲们有好的办法请告诉我。
延伸阅读:
系统调用的意义为了和用户空间上的进程进行交互,内核...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......(1)两个文件的交集,并集
1. 取出两个文件的并集(重复的行只保留一份)
cat file1 file2 | sort | uniq & file3
2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)
cat file1 file2 | sort | uniq -d & file3
3. 删除交集,留下其他的行
cat file1 file2 | sort | uniq -u & file3
(2)两个文件合并
一个文件在上,一个文件在下
cat file1 file2 & file3
一个文件在左,一个文件在右
paste file1 file2 & file3
(3)一个文件去掉重复的行
sort file | uniq
注意:重复的多行记为一行,也就是说这些重复的行还在,只是全部省略为一行!
sort file | uniq –u
上面的命令可以把重复的行全部去掉,也就是文件中的非重复行!
阅读(...) 评论()}

我要回帖

更多关于 linux文件内容去重 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信