Linux命令去重統(tǒng)計排序(awk命令去重,sort, uniq命令去重統(tǒng)計)

awk命令去重,sort, uniq命令去重統(tǒng)計

利用Linux命令行進行文本按行去重并按重復次數排序

linux命令行提供了非常強大的文本處理功能,組合利用linux命令能實現好多強大的功能。本文這里舉例說明如何利用Linux命令行進行文本按行去重并按重復次數排序。主要用到的命令有sort,uniq和cut。其中,sort主要功能是排序,uniq主要功能是實現相鄰文本行的去重,cut可以從文本行中提取相應的文本列(簡單地說,就是按列操作文本行)。

用于演示的測試文件內容如下:

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.?

實現命令及過程如下:

1、文本行去重

(1)排序?

由于uniq命令只能對相鄰行進行去重復操作,所以在進行去重前,先要對文本行進行排序,使重復行集中到一起。?

$ 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)去掉相鄰的重復行?

$ 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、文本行去重并按重復次數排序?

(1)首先,對文本行進行去重并統(tǒng)計重復次數(uniq命令加-c選項可以實現對重復次數進行統(tǒng)計。)。?

$ 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)對文本行按重復次數進行排序。?

sort -n可以識別每行開頭的數字,并按其大小對文本行進行排序。默認是按升序排列,如果想要按降序要加-r選項(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.

(3)每行前面的刪除重復次數。?

cut命令可以按列操作文本行??梢钥闯銮懊娴闹貜痛螖嫡?個字符,因此,可以用命令cut -c 9- 取出每行第9個及其以后的字符。?

$ 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.?

下面附帶說一下cut命令的使用,用法如下:

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常常表示具體數字;?

file表示的自然是要操作的文本文件的名稱;?

delim(英文全寫:delimiter)表示分隔符,默認情況下為TAB;?

-s表示不包括那些不含分隔符的行(這樣有利于去掉注釋和標題)?

三種方式中,表示從指定的范圍中提取字節(jié)(-b)、或字符(-c)、或字段(-f)。

范圍的表示方法:?

n 只有第n項?

n- 從第n項一直到行尾?

n-m 從第n項到第m項(包括m)?

-m 從一行的開始到第m項(包括m)?

- 從一行的開始到結束的所有項?

在寫這篇文章的時候,用到了vim的大小寫轉化的快捷鍵:gu變小寫,gU變大寫。結合ctrl+v能夠將一片文字中的字符進行大小寫轉換,非常好用。

awk命令去除文件中重復數據的辦法

  首先準備一個文本文件,隨便寫個文件,包含重復行數據的即可,或者你可以參考我這里的文件:

CodingAnts@ubuntu:~/awk$ cat dup

hello world

awk

coding ants

hello world

awk

hello world

awk

coding ants

coding ants

  共有9行,后面6行都是重復的前面的幾行,最終的效果應該是只顯示上面重點顯示的那幾行,先來看看效果:

CodingAnts@ubuntu:~/awk$ awk '!a[$0]++' dup

hello world

awk

coding ants

  在《awk程序指令模型》中介紹了awk的程序指令由模式和操作組成,即Pattern { Action }的形式,如果省略Action,則默認執(zhí)行 print $0 的操作。

  實現去除重復功能的就是這里的Pattern:

!a[$0]++

  在awk中,對于未初始化的數組變量,在進行數值運算的時候,會賦予初值0,因此a[$0]=0,++運算符的特性是先取值,后加1,因此Pattern等價于

!0

  而0為假,!為取反,因此整個Pattern最后的結果為1,相當于if(1),Pattern匹配成功,輸出當前記錄,對于dup文件,前3條記錄的處理方式都是如此。

  當讀取第4行數據“hello world”的時候,a[$0]=1,取反后的結果為0,即Pattern為0,Pattern匹配失敗,因此不輸出這條記錄,后續(xù)的數據以此類推,最終成功實現去除文件中的重復行。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容