2012-11-27 84 views
5
​​3210

我想根據排序在第3列中的值的文件,所以我用:Bash-是否有可能爲行的唯一一列使用-uniq?

sort -rnk3 myfile 

2.gu Qxy 23 
4.gui Qxr 21 
3.guT QWS 18 
1.gui Qxx 16 

現在,我必須輸出(行開始3.gui是,因爲行與4.gui具有更大的價值)

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

我不能使用-head,因爲我有幾百萬行,我不從哪裏切,我想不出辦法使用-uniq因爲它把一個行整個,因爲我不知道-uniq看第一列,它計算一條具有唯一性的行,它輸出它 - 這是正常的。我知道-uniq可以忽略一些字符,但你可以從例子中看到的第一列可能有不同的字符數..

請諮詢..

+0

可能重複[有沒有一種方式,以「uniq的」柱?(HTTP ://stackoverflow.com/questions/1915636/is-there-a-way-to-uniq-by-column) –

回答

8

試試這個:

sort -rnk3 myfile | awk -F"[. ]" '!a[$2]++' 

AWK刪除根據第二列重複。這實際上是一個着名的awk語法,用於刪除重複項。維護第二個字段記錄的數組。每次打印記錄之前,都會在陣列中檢查第二個字段。如果不存在,則將其打印,否則將其丟棄,因爲它是重複的。這是使用++實現的。第一次遇到記錄時,該++將自修復後的計數保持爲0。隨後的發生會增加否定時的價值成爲錯誤。

+0

@Guru ..你介意解釋一下-awk命令嗎? – teutara

+1

@teutara:更新 – Guru

+0

- 感謝一噸。我不明白爲什麼使用第二行(哈希)。 – teutara

2

在這裏你去:

sort -rnk3 file | awk -F'[. ]' '{ if (a[$2]++ == 0) print }' 

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

這使用awk檢查在第二場中重複的值,其中由現場分隔符號可以是空白或句點。所以這是它會將第二個領域是:

$ awk -F'[. ]' '{ print $2 }' file 

gu 
gui 
guT 
gui 

awk變量$0代表整條生產線,$1表示第一場,等等..

awk -F'[. ]' '{ if (a[$2]++ == 0) print }'-F選項讓您指定字段分隔符,在這種情況下,它是空格或句點。

+0

嘿@sudo_O ..再次感謝。你能解釋一下-awk命令嗎? – teutara

0

所以我發現這個由所有強大和令人驚歎的谷歌 - 我的小腳本建立了@sudo_O的答案,因爲它顯示了你找到的所有重複行......,而不是沒有重複的文件。

我發現在第3列(端口)所有重複的文字是在一個名爲master.txt文件

 
awk '{if (a[$3]++ > 0) print}' master.txt | while read site thread port 
do 
    grep $port master.txt 
done 
相關問題