永发信息网

LINUX下去除文件中重复的行

答案:2  悬赏:80  手机版
解决时间 2021-11-29 13:35
  • 提问者网友:雪舞兮
  • 2021-11-28 22:08
LINUX下去除文件中重复的行
最佳答案
  • 五星知识达人网友:神的生死簿
  • 2021-11-28 23:35
比如你/etc/passwd文件中有重复的行,执行如下指令清除:
cat /etc/passwd | sort -u > /tmp/passwd

这样/tmp/passwd中就没有重复的行了
全部回答
  • 1楼网友:鸽屿
  • 2021-11-29 00:11
wk肯定行

这是一个cu的精华帖,差不多,对于你的问题你给稍等我修改一下。(ps感谢红袖添香大姐)
CU精华 经典回顾

#假设我有如下文件:
#cat aa
#123 def1 456
#345 def2 812
#123 def3 563
#322 def4 684
#123 def5 879
#......................
#现在我想把第一列中字段相同的合并,第一列不相同的则保留,合并的原则就是保留第一个出现的前两个字段,第三个字段则把结果相加,以上面的示例为例:
#
#就是对于123开头的需要合并,合并后应该成为如下:
#cat aa
#123 def1 1898
#345 def2 812
#322 def4 684
#请问用shell如何实现?
#希望各位帮助!,谢谢!!

#要求总结:
#1 合并相同的第一列数据,并且计算第三列和
#2 第二列只保留第一次出现
#3 第一列顺序不变

觉得这个问题很经典,所以从CU论坛转过来了。
请大家一起学习

我们站在巨人的肩膀上。

问题补充:

看不太懂实现可以讲一下思路吗?

a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
我是这样做的
--------------------------2
谢谢你的补充, 已经明白了你对split的适用技巧,是用split(a[$1],tmp)在碰到匹配的$1时取出以前的统计结然后再用$3加上以前的结果是吧,很巧妙。谢谢
但是有2个问题:
1不满足 第二列保留第一次出现记录(现在是保留最后一次出现)
2不满足 第一列按照原来文件顺序出现

看看这个
awk 'BEING
{
a[$1]+=$3
if(length(b[$1])==0)b[$1]=$2
if($1 in ind)next
ind[$1]
key[n]=$1
n++
}
END{
for(i in key)print key[i],b[key[i]],a[key[i]]
}' filename

#######################
#######################
#######################
这样就行了
#!/bin/bash

awk 'BEGIN
{
if($0 in a)next
a[$0]
b[n]=$0
n++
}
END{
for(i in b)print b[i]
}' data

前提是你的数据文件里面每行没有空格,如果有用-F设定一个没有的字符作分隔符就
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯