終于明白awk如何牛掰地不排序也能去掉文件里的重復(fù)行了

因?yàn)楣ぷ髟蛑巢希?jīng)常經(jīng)統(tǒng)計(jì)一些文本內(nèi)容轿衔,要去除重復(fù),之前都是cat xx | sort | uniq 類的命令睦疫。

自從開始關(guān)注使用VIM之后呀枢,發(fā)現(xiàn)VIM真的很強(qiáng)大,直接有去重功能笼痛,怪不得這么多Linuxer都喜歡它裙秋。

我這里只說它的去重功能首先講點(diǎn)基礎(chǔ),

awk流程是逐行處理的缨伊,默認(rèn)從文件的第一行一直處理到文件最后一行摘刑,

還要知道awk的基本命令格式是'pattern{action}'先匹配各種各樣的樣式,然后大括號(hào)里處理如何打印輸出刻坊,

默認(rèn)的只要匹配了pattern就{print $0}枷恕,如果pattern未命中其判斷值為假(0)那么就不會(huì)再去處理{action}了

pattern命中則為判斷值為真(非0)就去處理{action}。

以下操作都是在vim命令模式下的操作

復(fù)制內(nèi)容到剪貼板

代碼:

: sort //可以直接排序谭胚,這個(gè)太好用了

:g/^\(.*\)$\n\1$/d ? ?//去除重復(fù)行

:g/\%(^\1$\n\)\@<=\(.*\)$/d //功能同上徐块,也是去除重復(fù)行

:g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d//功能同上,也是去除重復(fù)行

其實(shí)都是一些正則灾而,但是本人正則不太好胡控,也真的解釋不清,希望有大牛能詳細(xì)的解釋下旁趟,每個(gè)正則是神馬意思昼激!


因?yàn)楣ぷ髟颍?jīng)常經(jīng)統(tǒng)計(jì)一些文本內(nèi)容锡搜,要去除重復(fù)橙困,之前都是cat xx | sort | uniq 類的命令,自從開始關(guān)注使用VIM之后耕餐,發(fā)現(xiàn)VIM真的很強(qiáng)大凡傅,直接有去重功能,怪不得這么多Linuxer都喜歡它肠缔。我這里只說它的去重功能

以下操作都是在命令模式下的操作

復(fù)制內(nèi)容到剪貼板

代碼:

: sort //可以直接排序夏跷,這個(gè)太好用了

:g/^\(.*\)$\n\1$/d ? ?//去除重復(fù)行

:g/\%(^\1$\n\)\@<=\(.*\)$/d //功能同上,也是去除重復(fù)行

:g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d//功能同上桩砰,也是去除重復(fù)行

其實(shí)都是一些正則拓春,但是本人正則不太好释簿,也真的解釋不清亚隅,希望有大牛能詳細(xì)的解釋下,每個(gè)正則是神馬意思庶溶!

-------------------------------------------------------------------------------------

awk '!a[$0]++'

而如果使用sort加uniq進(jìn)行排序的話煮纵,這個(gè)文檔是看不出有什么不妥懂鸵。

不過我要處理的是用戶名與密碼一行行對(duì)應(yīng)好的,如果使用sort + uniq處理的話行疏,用戶名都排到一塊了匆光,密碼也又都跑到一塊了。

這樣就分不出來那個(gè)是那個(gè)了酿联。

而使用的腳本很簡單:

awk '!x[$0]++' filename

注:此處的x只是一個(gè)數(shù)據(jù)參數(shù)的名字而已终息,隨你用a、b贞让、c周崭、d都行。

簡要解釋一下喳张,awk 的基本執(zhí)行流程是续镇,對(duì)文件的每一行,做一個(gè)指定的邏輯判斷销部,如果邏輯判斷成立摸航,則執(zhí)行指定的命令;如果邏輯判斷不成立酱虎,則直接跳過這一行。

我們這里寫的 awk 命令是!x[$0]++擂涛,意思是:

首先創(chuàng)建一個(gè) map 叫x逢净,然后用當(dāng)前行的全文$0作為 map 的 key,到 map 中查找相應(yīng)的 value歼指,如果沒找到爹土,則整個(gè)表達(dá)式的值為真,可以執(zhí)行之后的語句踩身;

如果找到了胀茵,則表達(dá)式的值為假,跳過這一行挟阻。

由于表達(dá)式之后有++琼娘,因此如果某個(gè) key 找不到對(duì)應(yīng)的 value,該++操作會(huì)先把對(duì)應(yīng)的 value 設(shè)成 0附鸽,然后再自增成 1脱拼,這樣下次再遇到重復(fù)的行的時(shí)候,對(duì)應(yīng)的 key 就能找到一個(gè)非 0 的 value 了坷备。

注:該處的map類似于array數(shù)組熄浓,只不過在awk中叫array不恰當(dāng)。

awk Oneline中我們也學(xué)到過省撑,awk 的流程是先判斷表達(dá)式赌蔑,表達(dá)式為真的時(shí)候就執(zhí)行語句俯在,可是我們前面寫的這個(gè) awk 命令里只有表達(dá)式,沒有語句娃惯,那我們執(zhí)行什么呢跷乐?原來,當(dāng)語句被省略的時(shí)候趾浅,awk 就執(zhí)行默認(rèn)的語句愕提,即打印整個(gè)完整的當(dāng)前行。就這樣皿哨,我們通過這個(gè)非常簡短的 awk 命令實(shí)現(xiàn)了去除重復(fù)行并保留原有文件順序的功能揪荣。

-------------------------------------------------------------------------------------

awk '!x[$0]++' shareprofile.txt > shareprofile_awk.txt

-------------------------------------------------------------------------------------

舉個(gè)最簡單的例子:awk '1' file和awk '{print $0}' file是一個(gè)道理,都是從頭到尾依次打印文件的每一行

基礎(chǔ)知識(shí)就這些往史,如果底太潮去man awk或者google找吧仗颈。

'!a[$0]++'

分成幾個(gè)部分簡單解釋下吧

這個(gè)命令沒有{action}也就是說,只要pattern部分判斷值為真(非0)就打印正行椎例,否則就跳過不打印

挨决!在awk是取相反的意思,就是把對(duì)的變成錯(cuò)的把真的變成假的订歪,放在這個(gè)命令中是神馬作用一會(huì)解釋

a[$0]這個(gè)非常好理解脖祈,建立數(shù)組a其變量是文本中的每一行,awk里$1是第一列刷晋,$2是第二列盖高,以此類推$NF是最后一列,而$0是代表所有列及分隔符眼虱,也就是一整行喻奥,這樣如果pattern是真的那就打印一整行

++的意思是a數(shù)組取變量完畢后,對(duì)該數(shù)組值+1

找個(gè)最簡單的文檔來解釋一下

復(fù)制內(nèi)容到剪貼板

代碼:

cat file

xxx

yyy

xxx

zzz

這個(gè)文件有4行捏悬,其中第一撞蚕、三行是重復(fù)的。套用這個(gè)命令處理流程如下

獲取第一行a[xxx]过牙,因?yàn)檫@是第一行甥厦,數(shù)組a里從沒見過xxx這個(gè)變量,那么自然他的值就是假(0)也就是說a[xxx]=0寇钉,這個(gè)時(shí)候刀疙!就有大作用了,他把a(bǔ)[xxx]假(0)變成了a[xxx]為真(!0)這個(gè)時(shí)候原本不改打印的第一行就變成了應(yīng)該打印了扫倡,取邏輯反后對(duì)a[xxx]的值+1然后處理第二行

第二行a[yyy]這個(gè)情況跟剛才第一行的a[xxx]一樣谦秧,也應(yīng)該打印他

到第三行的時(shí)候情況遍了,因?yàn)榈谝恍幸呀?jīng)出現(xiàn)過了a[xxx]并且已經(jīng)++過了他的值已經(jīng)是非0而不是前兩行的0了,本應(yīng)打印但這時(shí)候再由油够!取邏輯反就不必打印了

第四行a[zzz]就又和第一蚁袭、二兩行一樣了征懈。

所以執(zhí)行完就是這個(gè)結(jié)果

awk '!a[$0]++' file

xxx

yyy

zzz

再把file搞稍微復(fù)雜點(diǎn)

復(fù)制內(nèi)容到剪貼板

代碼:

awk '{print NR,$0}' file

1 xxx

2 yyy

3 zzz

4 xxx

5 yyy

6 zzz

7 xxx

8 yyy

9 zzz

一共9行文本石咬,3行一次重復(fù)。為了看得更清楚卖哎,本來默認(rèn)的{print $0}稍微改下鬼悠,變成{print NR(行號(hào)),$0}。

那么現(xiàn)在來執(zhí)行下剛才講的試試看

復(fù)制內(nèi)容到剪貼板

代碼:

awk '!a[$0]++{print NR,$0}' file

1 xxx

2 yyy

3 zzz

復(fù)制內(nèi)容到剪貼板

代碼:

awk 'a[$0]++{print NR,$0}' file

4 xxx

5 yyy

6 zzz

7 xxx

8 yyy

9 zzz

很明顯了吧亏娜,有焕窝!的命令是只打印第一次出現(xiàn)的$0也就是去除重復(fù)咯,而沒有维贺!的命令正好跟他相反它掂,就是僅僅去除第一次出現(xiàn)的$0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溯泣,隨后出現(xiàn)的幾起案子虐秋,更是在濱河造成了極大的恐慌,老刑警劉巖垃沦,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件客给,死亡現(xiàn)場離奇詭異,居然都是意外死亡肢簿,警方通過查閱死者的電腦和手機(jī)靶剑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來池充,“玉大人桩引,你說我怎么就攤上這事∈湛洌” “怎么了阐污?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咱圆。 經(jīng)常有香客問我笛辟,道長,這世上最難降的妖魔是什么序苏? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任手幢,我火速辦了婚禮,結(jié)果婚禮上忱详,老公的妹妹穿的比我還像新娘围来。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布监透。 她就那樣靜靜地躺著桶错,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胀蛮。 梳的紋絲不亂的頭發(fā)上院刁,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音粪狼,去河邊找鬼退腥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛再榄,可吹牛的內(nèi)容都是我干的狡刘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼困鸥,長吁一口氣:“原來是場噩夢啊……” “哼嗅蔬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疾就,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤澜术,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后虐译,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘪板,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年漆诽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侮攀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厢拭,死狀恐怖兰英,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情供鸠,我是刑警寧澤畦贸,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站楞捂,受9級(jí)特大地震影響薄坏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寨闹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一胶坠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧繁堡,春花似錦沈善、人聲如沸乡数。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽净赴。三九已至,卻和暖如春罩润,著一層夾襖步出監(jiān)牢的瞬間玖翅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工哨啃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烧栋,地道東北人写妥。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓拳球,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珍特。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祝峻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • awk介紹awk變量printf命令:實(shí)現(xiàn)格式化輸出操作符awk patternawk actionawk數(shù)組aw...
    哈嘍別樣閱讀 1,564評(píng)論 0 4
  • Linux指令中文說明傳送入口 整理自Linux指令中文說明 文本和數(shù)據(jù)進(jìn)行處理的編程語言awk 是一種編程語言,...
    釋閑人閱讀 2,120評(píng)論 1 6
  • 本章主要學(xué)習(xí)內(nèi)容awk介紹 ?awk基本用法 ?awk變量 ?awk格式化 ?awk操作符 ?awk條件判斷 ?a...
    楠人幫閱讀 1,267評(píng)論 0 8
  • 1扎筒、Nginx日志分析日志格式:'$remote_addr - $remote_user [$time_local...
    運(yùn)維前線閱讀 714評(píng)論 0 4
  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,984評(píng)論 0 13