2012-07-26 32 views
4

我使用uniq -c一些文本文件。 它像這樣的輸出:爲什麼uniq -c用空格而不是 t輸出?

123(space)first word(tab)other things 
    2(space)second word(tab)other things 

....

所以我需要提取總數目(如123和2的上方),但我不能找出如何,因爲如果我分裂此行空間,它會喜歡這個['123', 'first', 'word(tab)other', 'things']。 我想知道爲什麼它不與標籤輸出?

如何提取shell中的總數? (我終於用python,WTF提取它)

更新:抱歉,我沒有正確描述我的問題。我不想總結總數,我只是想用(tab)替換(空格),但它不會影響空格,因爲我仍然需要數據。就像這樣:

123(tab)first word(tab)other things 
    2(tab)second word(tab)other things 
+0

選項卡不是空格,所以awk是正確的。 – 2012-07-26 13:35:08

+0

@Tichodroma不,你沒跟着我。我的意思是如果我按空格分隔線,我無法正確地獲取數據。 – MoreFreeze 2012-07-26 13:39:08

回答

5

試試這個:

uniq -c | sed -r 's/^(*[^ ]+) +/\1\t/' 
+0

這就是我想要的!謝謝大家。我忘了我終於可以輸掉/ g了。 – MoreFreeze 2012-07-27 02:18:38

1

可以使用awk總結所有的數字:

awk '{s+=$1}END{print s}' 
0
$ cat <file> | uniq -c | awk -F" " '{sum += $1} END {print sum}' 
+2

對任何出現「貓單文件」的人都會嗤之以鼻;它可以被I/O重定向所取代。甚至還有[UUOC](http://www.catb.org/jargon/html/U/UUOC.html)獎。 – 2012-07-26 13:46:27

+0

Unix的另一個好處就是如何使用管道保持代碼清潔和結構良好。當然,你可以使用重定向而不是'cat file',但是以這種形式進行展示/解釋是完全合理的(甚至是產品編碼),因爲在實踐中,它通常最終會成爲一個更復雜的命令,關閉。表演的觀點也是似是而非的;大多數情況下它並不重要,而且爲了提高可讀性您最好進行優化。 – danfuzz 2012-07-26 14:07:25

+0

是的,我通常使用它作爲一個其他進程的佔位符,當在線提供示例時,它會打印到stdout。 – vergenzt 2012-07-26 14:34:13

5

嘗試:

uniq -c text.file | sed -e 's/ *//' -e 's/ /\t/' 

這將刪除行數之前的空格,然後僅用標籤替換第一個空格。

要使用選項卡代替了所有的空格,使用TR:

uniq -c text.file | tr ' ' '\t' 

與單個標籤更換標籤的所有連續運行,使用-s:

uniq -c text.file | tr -s ' ' '\t' 
+0

嘿,它確實有用!謝謝你們一樣。 – MoreFreeze 2012-07-27 02:20:14

0

一個可能的解決方案,以獲得標籤在計數之後是編寫一個類似於uniq -c的腳本,其格式完全符合您的要求。這是一個快速嘗試(似乎通過我的分鐘左右的測試):

awk ' 
(NR == 1) || ($0 != lastLine) { 
    if (NR != 1) { 
     printf("%d\t%s\n", count, lastLine); 
    } 
    lastLine = $0; 
    count = 1; 
    next; 
} 
{ 
    count++; 
} 
END { 
    printf("%d\t%s\n", count, lastLine); 
} 
' yourFile.txt 
0

另一種解決方案。這相當於早期的sed解決方案,但它確實使用awk作爲請求/標記!

cat yourFile.txt \ 
    | uniq -c \ 
    | awk '{ 
     match($0, /^ *[^ ]* /); 
     printf("%s\t%s\n", $1, substr($0, RLENGTH + 1)); 
     }' 
相關問題