我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

linux排序去重命令 linux按列去重

linux命令对某一列去重/统计

cat file.csv | awk -F '\t' '{print $2}'

创新互联是一家专注于网站设计、做网站与策划设计,砀山网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:砀山等地区。砀山做网站价格咨询:18982081108

'\t'指的是file.csv不同列以'\t'分割,如果的是以其他符号分割,换成其她符号;

'{print $2}'是指取第2列,此处从1开始计数,第1列,第2列;

一般去重之前要进行排序

cat file.csv | awk -F '\t' '{print $2}' | sort | uniq

前半部分与命令1一样,后面加上| sort | uniq

比如通过命令2发现,第2列取值有两种,分别是'neg'和‘pos’,那么我想知道有多少行的第2列取值为'pos',多少行的第2列取值为'neg'。

cat file.csv | awk -F '\t' '{print $2}' | grep -o 'neg'| wc -l

前半部分与命令1一样,后面加上 | grep -o 'neg'| wc -l

grep -o 'neg'就是取出取值为'neg'的行

wc -l 是计数有多少行

每天一个linux命令(1)sort

sort 是将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按照ASCII码值进行比较,默认将他们按照升序输出

降序

在输出中去重

将排序结果输出到原文件

sort的默认输出是输出到标准输出,如果想把结果输出到文件,需要 sort file newfile,但是如果想把结果输出到原文件这样就不行了,这时就需要 使用sort -o

以数值来排序

sort 默认是按照字符串排序的,这样就会出现10比3小的情况,sort -n 就可以告诉sort 以整数排序

-t 后面跟 分隔符

-k 后面跟数字,表示用第几列排序

如 sort -t : -k 2 表示把每行 以:号分割,按照第二列排序

banana:30:5.5

orange:20:3.4

apple:10:2.5

我们可以看到,当baidu 和soho都是100的时候,baidu排在前面,当当前域按照默认规矩,是从第一个域开始进行升序排序,因此baidu排在了sohu前面。

sort 支持 -k 2 -k3这种模式,如果你需要,你可以继续这么写下去

你仔细看看,在-k 3后面偷偷加上了一个小写字母r,r和-r的作用是一样,你也可以把前面的-n去掉 在r后面加上n,如下

其实-k 选项 功能很强大,语法[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

从逗号前后 分为两大部分,即-k 2,2,是严格使用第一个域排序,如果只设置-k 2 其实是按照从第一个域到行尾。逗号分开的每部分又有一个点表示子域,即-k 1.2表示 按照第一个域的第二个字符排序,Modifiers就是我们用到的n和r 如 -k 1.2nr 具体我们看下面的例子。

我们使用了-k 1.2,这就表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。这和之前说到的按照默认的排序规则 是不同的,当第一个域的第二个字符相同时,他不会去按照第一个字符排序,而是按照后面的字符排序,这是因为-k 1.2是对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。而之前的夸域其实是一种假象。

-u只识别用-k设定的域,发现相同,就将后续相同的行都删除

但是这时候,却一行也没有删除。原来-u是会权衡所有-k选项,将都相同的才会删除,只要其中有一级不同都不会轻易删除的

可以用到b、d、f、i、n 或 r。

其中n和r你肯定已经很熟悉了。

b表示忽略本域的签到空白符号。

d表示对本域按照字典顺序排序(即,只考虑空白和字母)。

f表示对本域忽略大小写进行排序。

i表示忽略“不可打印字符”,只针对可打印字符进行排序。(有些ASCII就是不可打印字符,比如\a是报警,\b是退格,\n是换行,\r是回车等等)

【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 命令实现了去除重复行并保留原有文件顺序的功能。

linux去重命令

linux去重命令是什么呢?

在介绍uniq命令之前,我们先来新建在下面的案例中需要用到的文件/tmp/uniq.txt,内容如下

默认情况下uniq只会检索相邻的重复数据从而去重。在/tmp/uniq.txt中虽然“onmpw web site” 有三条,但是其中一条是和其他两条不相邻的,所以只去重了一条,同理“error php function”也是这种情况。

鉴于以上的检索机制,所以uniq一般情况下要和sort命令一块儿使用。

复制代码

# sort 1.txt | uniq

alpha css web

cat linux command

error php function

hello world

onmpw web site

recruise page site

repeat no data

wello web site

复制代码

现在再看是不是所有的重复项都已经经过去重处理了。

好了,小试牛刀一把以后,下面我们开始对uniq命令的选项进行简单的介绍。

-c 统计每一行数据的重复次数

复制代码

sort 1.txt | uniq -c

1 alpha css web

1 cat linux command

2 error php function

1 hello world

3 onmpw web site

1 recruise page site

1 repeat no data

1 wello web site

复制代码

我们看 “error php function”出现了两次,“onmpw web site”出现了三次。其余的都没有重复项所以为1。

-i 忽略大小写

在1.txt中添加一行数据 “Error PHP function”

复制代码

cat 1.txt

alpha css web

cat linux command

error php function

hello world

onmpw web site

onmpw web site

wello web site

Error PHP function

recruise page site

error php function

repeat no data

onmpw web site

复制代码

复制代码

sort 1.txt | uniq –c

1 alpha css web

1 cat linux command

2 error php function

1 Error PHP function

1 hello world

3 onmpw web site

1 recruise page site

1 repeat no data

1 wello web site

复制代码

我们看结果,uniq默认是区分大小写的。使用-i可以忽略掉大小写问题

复制代码

sort 1.txt | uniq –c –i

1 alpha css web

1 cat linux command

3 error php function

1 hello world

3 onmpw web site

1 recruise page site

1 repeat no data

1 wello web site

复制代码

现在再看是不是大小写已经忽略掉了。

-u 只输出没有重复的数据

复制代码

sort 1.txt | uniq –iu

alpha css web

cat linux command

hello world

recruise page site

repeat no data

wello web site

复制代码

看到没,结果中的“error php function”和“onmpw web site”都没有被输出。

-w N 表示从第一个字符开始只检索N个字符来判重。

复制代码

sort 1.txt | uniq –iw 2

alpha css web

cat linux command

error php function

hello world

onmpw web site

recruise page site

wello web site

复制代码

这里我们让uniq只对前两个字符进行检索,recruit 和 repeat前两个字符都是re,所以这两行也被认为是重复的。

-f N 表示略过前面N个字段,从第N+1个字段开始检索重复数据。以空格符或者tab键为分隔符。

复制代码

sort 1.txt | uniq –icf 2

1 alpha css web

1 cat linux command

3 error php function

1 hello world

4 onmpw web site

1 repeat no data

1 wello web site

复制代码

我们在结果中可以看到,这是略过前面的2个字段,从第三个字段开始判重的。“recruise page site” 和 “onmpw web site”的第三个字段相同,所以被认为是相同的数据。但是我们看到,“wello web site”和“onmpw web site”不但第三个字段相同,第二个也相同。那为什么它不被计入“onmpw web site”的重复数据中呢。对于这个问题就要回到前面说的,uniq只检测相邻的数据是否是重复的。

要解决这个问题还需要在sort命令上着手。还记得sort命令的-k选项吗,没错,我们就用它来解决。

复制代码

sort –k 2 1.txt | uniq –icf 2

1 alpha css web

1 cat linux command

1 repeat no data

1 recruise page site

3 error php function

4 onmpw web site

1 hello world

复制代码

我们看,是不是解决了。

-s N表示略过前面N个字符,关于这个选项的例子我们这里就不再举了,该选项和-f N的用法差不多。只不过-f N是略过前面N个字段;-s是略过前面N个字符。

-d 只输出有重复项的第一条的数据。

sort 1.txt | uniq -idw 2

repeat no data

error php function

onmpw web site

结果只有这三条。为什么会有“repeat no data”这条数据,这里注意-w 2的应用。

-D 对于重复项全部输出

复制代码

sort 1.txt | uniq –iDw 2

repeat no data

recruise page site

error php function

error php function

Error PHP function

onmpw web site

onmpw web site

onmpw web site

复制代码

好了,关于uniq的选项的所有常用的命令已经都介绍完了。关于uniq更详细的信息可以使用命令info uniq。


分享文章:linux排序去重命令 linux按列去重
URL地址:http://shouzuofang.com/article/dogsshc.html

其他资讯