用uniq,如下,將 1.txt 中 所有 "相鄰" 重復(fù)行合并成一行,結(jié)果存入 2.txt
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比修武網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式修武網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋修武地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
uniq?1.txt??2.txt
如果是想將相鄰重復(fù)行徹底刪掉(而不是合并成一行),可以用
uniq?-u?1.txt??2.txt
linux去重命令是什么呢?
在介紹uniq命令之前,我們先來(lái)新建在下面的案例中需要用到的文件/tmp/uniq.txt,內(nèi)容如下
默認(rèn)情況下uniq只會(huì)檢索相鄰的重復(fù)數(shù)據(jù)從而去重。在/tmp/uniq.txt中雖然“onmpw web site” 有三條,但是其中一條是和其他兩條不相鄰的,所以只去重了一條,同理“error php function”也是這種情況。
鑒于以上的檢索機(jī)制,所以u(píng)niq一般情況下要和sort命令一塊兒使用。
復(fù)制代碼
# 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
復(fù)制代碼
現(xiàn)在再看是不是所有的重復(fù)項(xiàng)都已經(jīng)經(jīng)過(guò)去重處理了。
好了,小試牛刀一把以后,下面我們開(kāi)始對(duì)uniq命令的選項(xiàng)進(jìn)行簡(jiǎn)單的介紹。
-c 統(tǒng)計(jì)每一行數(shù)據(jù)的重復(fù)次數(shù)
復(fù)制代碼
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
復(fù)制代碼
我們看 “error php function”出現(xiàn)了兩次,“onmpw web site”出現(xiàn)了三次。其余的都沒(méi)有重復(fù)項(xiàng)所以為1。
-i 忽略大小寫(xiě)
在1.txt中添加一行數(shù)據(jù) “Error PHP function”
復(fù)制代碼
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
復(fù)制代碼
復(fù)制代碼
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
復(fù)制代碼
我們看結(jié)果,uniq默認(rèn)是區(qū)分大小寫(xiě)的。使用-i可以忽略掉大小寫(xiě)問(wèn)題
復(fù)制代碼
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
復(fù)制代碼
現(xiàn)在再看是不是大小寫(xiě)已經(jīng)忽略掉了。
-u 只輸出沒(méi)有重復(fù)的數(shù)據(jù)
復(fù)制代碼
sort 1.txt | uniq –iu
alpha css web
cat linux command
hello world
recruise page site
repeat no data
wello web site
復(fù)制代碼
看到?jīng)],結(jié)果中的“error php function”和“onmpw web site”都沒(méi)有被輸出。
-w N 表示從第一個(gè)字符開(kāi)始只檢索N個(gè)字符來(lái)判重。
復(fù)制代碼
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
復(fù)制代碼
這里我們讓uniq只對(duì)前兩個(gè)字符進(jìn)行檢索,recruit 和 repeat前兩個(gè)字符都是re,所以這兩行也被認(rèn)為是重復(fù)的。
-f N 表示略過(guò)前面N個(gè)字段,從第N+1個(gè)字段開(kāi)始檢索重復(fù)數(shù)據(jù)。以空格符或者tab鍵為分隔符。
復(fù)制代碼
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
復(fù)制代碼
我們?cè)诮Y(jié)果中可以看到,這是略過(guò)前面的2個(gè)字段,從第三個(gè)字段開(kāi)始判重的?!皉ecruise page site” 和 “onmpw web site”的第三個(gè)字段相同,所以被認(rèn)為是相同的數(shù)據(jù)。但是我們看到,“wello web site”和“onmpw web site”不但第三個(gè)字段相同,第二個(gè)也相同。那為什么它不被計(jì)入“onmpw web site”的重復(fù)數(shù)據(jù)中呢。對(duì)于這個(gè)問(wèn)題就要回到前面說(shuō)的,uniq只檢測(cè)相鄰的數(shù)據(jù)是否是重復(fù)的。
要解決這個(gè)問(wèn)題還需要在sort命令上著手。還記得sort命令的-k選項(xiàng)嗎,沒(méi)錯(cuò),我們就用它來(lái)解決。
復(fù)制代碼
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
復(fù)制代碼
我們看,是不是解決了。
-s N表示略過(guò)前面N個(gè)字符,關(guān)于這個(gè)選項(xiàng)的例子我們這里就不再舉了,該選項(xiàng)和-f N的用法差不多。只不過(guò)-f N是略過(guò)前面N個(gè)字段;-s是略過(guò)前面N個(gè)字符。
-d 只輸出有重復(fù)項(xiàng)的第一條的數(shù)據(jù)。
sort 1.txt | uniq -idw 2
repeat no data
error php function
onmpw web site
結(jié)果只有這三條。為什么會(huì)有“repeat no data”這條數(shù)據(jù),這里注意-w 2的應(yīng)用。
-D 對(duì)于重復(fù)項(xiàng)全部輸出
復(fù)制代碼
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
復(fù)制代碼
好了,關(guān)于uniq的選項(xiàng)的所有常用的命令已經(jīng)都介紹完了。關(guān)于uniq更詳細(xì)的信息可以使用命令info uniq。
通常如果我們想獲取一個(gè)文件里不重復(fù)的行的時(shí)候,我們可以直接通過(guò)?sort?-u?命令,先把文件排序,然后去掉連續(xù)的重復(fù)行就行。
可是,如果我們?nèi)サ糁貜?fù)行之后,還想保留文件原有的順序,該怎么辦呢?
雖然 Linux 下有個(gè)看上去似乎很有用的命令叫uniq,但事實(shí)上?uniq?命令僅僅只對(duì)連續(xù)的重復(fù)行有效。
如果不排序,直接使用 uniq 命令是沒(méi)有用的;使用?sort?-u?的話,我們就丟失了文件原有的行的順序了。
一個(gè)終極的解決方案是使用 awk:
簡(jiǎn)要解釋一下:awk 的基本執(zhí)行流程是,對(duì)文件的每一行,做一個(gè)指定的邏輯判斷,如果邏輯判斷成立,則執(zhí)行指定的命令;如果邏輯判斷不成立,則直接跳過(guò)這一行。
我們這里寫(xiě)的 awk 命令是!x[$0]++,意思是,首先創(chuàng)建一個(gè) map 叫x,然后用當(dāng)前行的全文$0作為 map 的 key,到 map 中查找相應(yīng)的 value,如果沒(méi)找到,則整個(gè)表達(dá)式的值為真,可以執(zhí)行之后的語(yǔ)句;如果找到了,則表達(dá)式的值為假,跳過(guò)這一行。
由于表達(dá)式之后有++,因此如果某個(gè) key 找不到對(duì)應(yīng)的 value,該++操作會(huì)先把對(duì)應(yīng)的 value 設(shè)成 0,然后再自增成 1,這樣下次再遇到重復(fù)的行的時(shí)候,對(duì)應(yīng)的 key 就能找到一個(gè)非 0 的 value 了。
我們前面說(shuō)過(guò),awk 的流程是先判斷表達(dá)式,表達(dá)式為真的時(shí)候就執(zhí)行語(yǔ)句,可是我們前面寫(xiě)的這個(gè) awk 命令里只有表達(dá)式,沒(méi)有語(yǔ)句,那我們執(zhí)行什么呢?原來(lái),當(dāng)語(yǔ)句被省略的時(shí)候,awk 就執(zhí)行默認(rèn)的語(yǔ)句,即打印整個(gè)完整的當(dāng)前行。就這樣,我們通過(guò)這個(gè)非常簡(jiǎn)短的 awk 命令實(shí)現(xiàn)了去除重復(fù)行并保留原有文件順序的功能。
利用linux命令行進(jìn)行文本按行去重并按重復(fù)次數(shù)排序linux命令行提供了非常強(qiáng)大的文本處理功能,組合利用linux命令能實(shí)現(xiàn)好多強(qiáng)大的功能。本文這里舉例說(shuō)明如何利用linux命令行進(jìn)行文本按行去重并按重復(fù)次數(shù)排序。主要用到的命令有sort,uniq和cut。其中,sort主要功能是排序,uniq主要功能是實(shí)現(xiàn)相鄰文本行的去重,cut可以從文本行中提取相應(yīng)的文本列(簡(jiǎn)單地說(shuō),就是按列操作文本行)。用于演示的測(cè)試文件內(nèi)容如下:[plain]Hello
World.
Apple
and
Nokia.
Hello
World.
I
wanna
buy
an
Apple
device.
The
Iphone
of
Apple
company.
Hello
World.
The
Iphone
of
Apple
company.
My
name
is
Friendfish.
Hello
World.
Apple
and
Nokia.
實(shí)現(xiàn)命令及過(guò)程如下:[plain]1、文本行去重
(1)排序
由于uniq命令只能對(duì)相鄰行進(jìn)行去重復(fù)操作,所以在進(jìn)行去重前,先要對(duì)文本行進(jìn)行排序,使重復(fù)行集中到一起。
$
sort
test.txt
Apple
and
Nokia.
Apple
and
Nokia.
Hello
World.
Hello
World.
Hello
World.
Hello
World.
I
wanna
buy
an
Apple
device.
My
name
is
Friendfish.
The
Iphone
of
Apple
company.
The
Iphone
of
Apple
company.
(2)去掉相鄰的重復(fù)行
$
sort
test.txt
|
uniq
Apple
and
Nokia.
Hello
World.
I
wanna
buy
an
Apple
device.
My
name
is
Friendfish.
The
Iphone
of
Apple
company.
2、文本行去重并按重復(fù)次數(shù)排序
(1)首先,對(duì)文本行進(jìn)行去重并統(tǒng)計(jì)重復(fù)次數(shù)(uniq命令加-c選項(xiàng)可以實(shí)現(xiàn)對(duì)重復(fù)次數(shù)進(jìn)行統(tǒng)計(jì)。)。
$
sort
test.txt
|
uniq
-c
2
Apple
and
Nokia.
4
Hello
World.
1
I
wanna
buy
an
Apple
device.
1
My
name
is
Friendfish.
2
The
Iphone
of
Apple
company.
(2)對(duì)文本行按重復(fù)次數(shù)進(jìn)行排序。
sort
-n可以識(shí)別每行開(kāi)頭的數(shù)字,并按其大小對(duì)文本行進(jìn)行排序。默認(rèn)是按升序排列,如果想要按降序要加-r選項(xiàng)(sort
-rn)。
$
sort
test.txt
|
uniq
-c
|
sort
-rn
4
Hello
World.
2
The
Iphone
of
Apple
company.
2
Apple
and
Nokia.
1
My
name
is
Friendfish.
1
I
wanna
buy
an
Apple
device.
(3)每行前面的刪除重復(fù)次數(shù)。
cut命令可以按列操作文本行。可以看出前面的重復(fù)次數(shù)占8個(gè)字符,因此,可以用命令cut
-c
9-
取出每行第9個(gè)及其以后的字符。
$
sort
test.txt
|
uniq
-c
|
sort
-rn
|
cut
-c
9-
Hello
World.
The
Iphone
of
Apple
company.
Apple
and
Nokia.
My
name
is
Friendfish.
I
wanna
buy
an
Apple
device.
下面附帶說(shuō)一下cut命令的使用,用法如下:[plain]cut
-b
list
[-n]
[file
...]
cut
-c
list
[file
...]
cut
-f
list
[-d
delim][-s][file
...]
上面的-b、-c、-f分別表示字節(jié)、字符、字段(即byte、character、field);
list表示-b、-c、-f操作范圍,-n常常表示具體數(shù)字;
file表示的自然是要操作的文本文件的名稱;
delim(英文全寫(xiě):delimiter)表示分隔符,默認(rèn)情況下為TAB;
-s表示不包括那些不含分隔符的行(這樣有利于去掉注釋和標(biāo)題)
三種方式中,表示從指定的范圍中提取字節(jié)(-b)、或字符(-c)、或字段(-f)。
范圍的表示方法:
n
只有第n項(xiàng)
n-
從第n項(xiàng)一直到行尾
n-m
從第n項(xiàng)到第m項(xiàng)(包括m)
-m
從一行的開(kāi)始到第m項(xiàng)(包括m)
-
從一行的開(kāi)始到結(jié)束的所有項(xiàng)
在寫(xiě)這篇文章的時(shí)候,用到了vim的大小寫(xiě)轉(zhuǎn)化的快捷鍵:gu變小寫(xiě),gU變大寫(xiě)。結(jié)合ctrl+v能夠?qū)⒁黄淖种械淖址M(jìn)行大小寫(xiě)轉(zhuǎn)換,非常好用。