2010-08-18 78 views
13

我一直在試圖在bash中的製表符分隔文件的每一列中獲取唯一值。所以,我使用了下面的命令。在bash中排序

cut -f <column_number> <filename> | sort | uniq -c 

它工作正常,我可以得到一個列和唯一值的數量一樣

105 Linux 
55 MacOS 
500 Windows 

我想要做的是不是由列值名稱排序(在這個例子中是操作系統名稱)我想按count排序它們,並可能在此輸出格式的第二列中計數。所以它將看起來像:

Windows 500 
MacOS 105 
Linux 55 

我該怎麼做?

回答

14

使用:

cut -f <col_num> <filename> 
    | sort 
    | uniq -c 
    | sort -r -k1 -n 
    | awk '{print $2" "$1}' 

sort -r -k1 -n排序以相反的順序,使用第一字段爲數值。 awk只是顛倒了列的順序。您可以測試從而增加管道命令(有更好的格式):

pax> echo '105 Linux 
55 MacOS 
500 Windows' | sort -r -k1 -n | awk '{printf "%-10s %5d\n",$2,$1}' 
Windows  500 
Linux  105 
MacOS   55 
+3

我通常做'排序-k1,1'進行排序只能由指定的字段,否則線路爲所有領域,從場1分選到該行的末尾。 – Hasturkun 2010-08-18 08:58:17

2

礦:

cut -f <column_number> <filename> | sort | uniq -c | awk '{ print $2" "$1}' | sort 

這將改變列順序(AWK),然後就進行排序輸出。

希望這將幫助你

+1

按名稱排序而非數量。 – 2010-08-18 16:06:47

+0

當然,從sfactor問題:「我想要做的是,而不是按列值名稱排序」 – sourcerebels 2010-08-19 04:50:34