1. 程式人生 > >Linux命令去重統計排序(awk命令去重,sort, uniq命令去重統計)

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

awk命令去重,sort, uniq命令去重統計

利用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)首先,對文字行進行去重並統計重複次數(uniq命令加-c選項可以實現對重複次數進行統計。)。
$ 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命令可以按列操作文字行。可以看出前面的重複次數佔8個字元,因此,可以用命令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分別表示位元組、字元、欄位(即byte、character、field);
list表示-b、-c、-f操作範圍,-n常常表示具體數字;
file表示的自然是要操作的文字檔案的名稱;
delim(英文全寫:delimiter)表示分隔符,預設情況下為TAB;
-s表示不包括那些不含分隔符的行(這樣有利於去掉註釋和標題)
三種方式中,表示從指定的範圍中提取位元組(-b)、或字元(-c)、或欄位(-f)。

範圍的表示方法:
n 只有第n項
n- 從第n項一直到行尾
n-m 從第n項到第m項(包括m)
-m 從一行的開始到第m項(包括m)
- 從一行的開始到結束的所有項
在寫這篇文章的時候,用到了vim的大小寫轉化的快捷鍵:gu變小寫,gU變大寫。結合ctrl+v能夠將一片文字中的字元進行大小寫轉換,非常好用。

awk命令去除檔案中重複資料的辦法

  首先準備一個文字檔案,隨便寫個檔案,包含重複行資料的即可,或者你可以參考我這裡的檔案:

[email protected]:~/awk$ cat dup
hello world
awk
coding ants
hello world
awk
hello world
awk
coding ants
coding ants

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

[email protected]:~/awk$ awk '!a[$0]++' dup
hello world
awk
coding ants

  在《awk程式指令模型》中介紹了awk的程式指令由模式和操作組成,即Pattern { Action }的形式,如果省略Action,則預設執行 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匹配失敗,因此不輸出這條記錄,後續的資料以此類推,最終成功實現去除檔案中的重複行。

相關推薦

Linux命令統計排序awk命令sort, uniq命令統計

awk命令去重,sort, uniq命令去重統計 利用Linux命令列進行文字按行去重並按重複次數排序 linux命令列提供了非常強大的文字處理功能,組合利用linux命令能實現好多強大的功能。本文這裡舉例說明如何利用Linux命令列進行文字按行去重並按

C:排序陣列flag

描述 現在給你兩堆數,每個堆中有n個數。你的任務是把這兩個堆並成一個堆,並把合併後的堆中的元素按從小到大的順序輸出。例如當n=5時,第一個堆是{1,2,3,4,5},第二個堆是{5,6,7,8,

對隨機數“”和“排序使用set實現

題目 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤100),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順

(排序演算法)linux c語言實現快速排序氣泡排序的改進版

 快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的

linux——Shell 腳本基礎篇變量類型變量操作定義運算與邏輯關系

字符型 代碼 子進程 變量類型 export 成功 bash變量 控制 path Shell 腳本基礎 1.變量 什麽是變量 #a=1 # echo $a 1 變量:可以變化的量 1.2變量名稱註意事項 變量名不能以數字開頭 不能與系統中已有的環境變量重名,盡量不要全部

拓撲排序字典序最小字典序最小

E. Minimal Labels 題意: 給出 m 條有向邊,組成有向無環圖,輸出一個 1 到 n 組成的排列,每個數只能出現一次,表示每個點的標號。如果有邊 (u,v)(u,v) 那麼 labelu<labelvlabelu<labelv 。要求最後

二分查詢和快速排序應該不能執行只是一些筆記

#include<iostream> using namespace std; template<class Type> //二分查詢 int BinarySearch(Type a[],const Type& x,int l,int r) {//a[]排好的遞

fio 命令入門到跑路千萬不能在系統所在的分割槽測試硬碟效能

fio是一種I / O工具,用於基準測試和壓力/硬體驗證。它支援19種不同型別的I / O引擎(sync,mmap,libaio,posixaio,SG v3,splice,null,network,syslet,guasi,solarisaio等),I / O優先順序(適用於較新的Linux核心)

將list集合中按照某個欄位排序從大到小)然後將list中的物件倒序

需求: 查詢資料庫的到多條據,將每一行資料相加求和,得到sum,在jsp中跟據sum總和排序。 首先,我是用Page<Analysis> page  去接受返回值,在controller層進行資料處理。List<Analysis> list  =

排序演算法10——圖解基數排序次位優先法LSD和主位優先法MSD

排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非

linux yum命令詳解以及查詢當前哪些包需要更新與更新命令

yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及SUSE中的Shell前端軟體包管理器。基於RPM包管理,能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關係,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。yum提供了

微軟筆試題 大型檔案外部排序二路歸併和k路歸併的實現和比較

這兩種排序方法都是先將一個無序的大的外部檔案,分成若干塊,分別讀到記憶體中。 將每一塊都先排好序,放到一個新的外部檔案中。 二路歸併的思路是每次將外部排序的檔案兩兩合併,變成一個二倍大小的檔案,然後對二倍大小的檔案繼續兩兩合併。直到最終合併為一個檔案為止。k路歸併是將外部排

Ubuntu14.04/Linux安裝LLVM/clang-3.7帶有標準庫 libc++libc++abi

一、不需原始碼編譯和手動配置libc++,libc++abi的可忽略這一部分 關於如何下載llvm,clang, libc++,libc++abi原始碼請參考第一篇文章第7部分,也可以參考官網有相關安裝說明 http://clang.ll

linux恢復誤刪除的檔案到處粘來的沒有驗證過

 1、恢復ext3檔案系統中的刪除檔案操作: (1)[email protected]:~$sudo ext3grep /dev/sdb1 --ls --inode 2  查詢/dev/sdb1檔案系統下刪除的所有檔案。顯示內容如下: Runningext3grep version 0.10.1

對連結串列進行排序不能額外空間時間為O(NL)

Sort a linked list in O(n log n) time using constant space complexity.         對一個連結串列進行排序,且時間複雜度要求為 O(n log n) ,空間複雜度為常量。一看到 O(n log n) 的排序,首先應該想到歸併排序

P1177 【模板】快速排序學完歸並和堆排之後的二更

emp 大於 如果 利用 最小數 方式 tom 數組比較 vertical P1177 【模板】快速排序 不用說,連題目上都標了是一道模板,那今天就來對能用到的許多排序方式進行一個總結: 選擇排序 選擇排序(Selection sort)是一種簡單直觀的排序算法。

Linux上安裝Nginx依賴環境和庫、Nginx安裝Nginx服務命令

安裝Nginx依賴環境和庫、Nginx安裝,Nginx服務命令   因為Nginx官方提供的是C原始碼,要自己進行編譯,所以需要自己擁有編譯所依賴的環境和庫才可正常編譯 安裝gcc yum -y install gcc automake autoconf libtool make 安裝g+

關於Android手機MTP模式連接的一些設置win7和ubuntu下以紅米1s為例

sta start .net eno bcm htm web date ati 有些手機的MTP模式在電腦上識別不了,須要一些設置才幹夠,以下就網上收集來的一些設置方法集中貼過來: 一、 win7下 參考:http://blog.ammrli.com/?p=11

假設分配給命令的連接位於本地掛起事務中ExecuteReader 要求命令擁有事務。命令的 Transaction 屬性尚未初始化

execute ati com data- dap system.in tty exceptio ada {System.InvalidOperationException: 假設分配給命令的連接位於本地掛起事務中。ExecuteReader 要求命令擁

中綴表達式轉後綴並計算只考慮個位整數不考慮除0等情況

sta put AS res r+ ring 位置 while AC 中綴轉後綴 public class 中綴轉後綴 { static char[] res;//存儲結果 static int len_r=0; static char[] st