当前位置:首页 » 操作系统 » linux重复行

linux重复行

发布时间: 2022-12-06 08:04:52

A. 【shell】linux删除文本重复行

通常如果我们想获取一个文件里不重复的行的时候,我们可以直接通过 sort -u 命令,先把文件排序,然后去掉连续的重复行就行。

可是,如果我们去掉重复行之后,还想保留文件原有的顺序,该怎么办呢?

虽然 Linux 下有个看上去似乎很有用的命令叫uniq,但事实上 uniq 命令仅仅只对连续的重复行有效。

如果不排序,直接使用 uniq 命令是没有用的;使用 sort -u 的话,我们就丢失了文件原有的行的顺序了。

一个终极的解决方案是使用 awk:

简要解释一下:awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行。

我们这里写的 awk 命令是!x[$0]++,意思是,首先创建一个 map 叫x,然后用当前行的全文$0作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。

由于表达式之后有++,因此如果某个 key 找不到对应的 value,该++操作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了。

我们前面说过,awk 的流程是先判断表达式,表达式为真的时候就执行语句,可是我们前面写的这个 awk 命令里只有表达式,没有语句,那我们执行什么呢?原来,当语句被省略的时候,awk 就执行默认的语句,即打印整个完整的当前行。就这样,我们通过这个非常简短的 awk 命令实现了去除重复行并保留原有文件顺序的功能。

B. Linux删除文件内重复行

第一,用sort+uniq,注意,单纯uniq是不行的。

第二,用sort+awk命令,注意,单纯awk同样不行,原因同上。

第三,用sort+sed命令,同样需要sort命令先排序。

以上原理都是上下行比对,如果中间开了几行,uniq就不生效
例如:
111
222
111
是不能正确排序的,必须是:
111
111
222
uniq才会生效,所以都需要先用sort 来排序,然后将结果输出到其他文件。

C. linux:排序,唯一与重复

对一组文件进行排序

按照数字顺序进行排序

逆序排序

按照月份排序

合并两个已经排序过的文件

找出已排序文件中不重复的行

检查文件是否已经排序过

按照某一列进行排序:-k

按照特定范围内的一组字符进行排序

打印唯一行

只显示唯一的行

统计各行在文件中出现的次数

找出文件中重复的行

==========================================================================================================

D. LINUX下去除文件中重复的行

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设定一个没有的字符作分隔符就

E. 如何快速删除Linux文件中的重复数据行

用uniq,如下,将 1.txt 中 所有 "相邻" 重复行合并成一行,结果存入 2.txt

uniq1.txt>2.txt

如果是想将相邻重复行彻底删掉(而不是合并成一行),可以用

uniq-u1.txt>2.txt

F. 如何快速删除Linux文件中的重复数据行

用uniq,如下,将 1.txt 中 所有 "相邻" 重复行合并成一行,结果存入 2.txt
1
uniq 1.txt > 2.txt
如果是想将相邻重复行彻底删掉(而不是合并成一行),可以用
1
uniq -u 1.txt > 2.txt

热点内容
安卓手机怎么拍人物和场景 发布:2024-05-08 06:55:39 浏览:280
phpurl中文乱码 发布:2024-05-08 06:25:34 浏览:52
社保账户及密码忘了怎么办 发布:2024-05-08 06:25:32 浏览:749
个人热点的密码怎么改 发布:2024-05-08 06:19:13 浏览:638
传递加密 发布:2024-05-08 06:19:02 浏览:681
c语言是啥意思啊 发布:2024-05-08 06:01:09 浏览:695
帝豪换压缩机 发布:2024-05-08 05:42:15 浏览:902
java文件时间 发布:2024-05-08 05:32:04 浏览:267
空气压强算法 发布:2024-05-08 05:29:47 浏览:294
c语言中double的范围 发布:2024-05-08 04:53:29 浏览:122