2012-01-09 94 views
43

我想使用unix命令打印文本文件每行中的字符數。我知道這是簡單的PowerShell如何打印文本文件每行中的字符數

gc abc.txt | % {$_.length} 

但我需要unix命令。

+0

軟件開發的第一條規則:「否」是指「否」。使用「num」或「number」。 – 2012-01-09 13:25:11

+3

[引用需要]。 – uprego 2015-12-16 08:28:49

回答

87

使用Awk。

awk '{ print length($0); }' abc.txt 
+5

我認爲'打印長度;'是等效的,POSIX以及http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html – 2015-11-19 23:24:20

+1

這也適用於mac os。 – bdemarest 2017-02-11 22:18:01

11
while read -r line; do echo ${#line}; done < abc.txt 

這是POSIX,所以它應該工作無處不在。

編輯:添加-r建議由威廉。

+0

+1,但是...如果輸入包含'\',這將失敗。使用讀-r – 2012-01-09 13:27:26

0

試試這個:

while read line  
do  
    echo -e |wc -m  
done <abc.txt  
+0

你的意思是'echo -e | wc -m',不是嗎?這是無用的命令使用; shell可以計算變量中的字符。再加上'echo -e'是完全不兼容的,並且在一半的shell中工作,而某些其他的轉義序列起作用,其餘的都沒有。 – 2012-01-09 13:46:32

+0

是的,正確的...錯誤。感謝您指出它。 – Rahul 2012-01-09 17:05:39

2

這裏是例如使用xargs

$ xargs -I% sh -c 'echo % | wc -c' < file 
+0

這個「echo%」不處理需要從shell引用的不安全字符。此外,「xargs」將按空格和換行符分割文件,而不僅僅是要求原始海報的新行。 – bovine 2015-03-06 23:15:50

1

我試過上面列出的其它一些問題,但隨着大文件的時候都從很遠體面的解決方案 - 特別是一條線的大小佔據了可用RAM的1/4以上。

bash和awk都渾濁了整條線,儘管對於這個問題它不是必需的。即使有足夠的內存,Bash也會在線路太長時出錯。

我已經實現了一個非常簡單的,相當未優化的python腳本,當使用大文件進行測試時(每行大約4 GB)不會啜泣,而且遠遠比這些腳本更好。

如果這是時間關鍵的生產代碼,那麼在測試這確實是一個瓶頸之後,您可以用C重寫想法或對讀取調用執行更好的優化(而不是一次只讀取一個字節)。

代碼假設換行符是一個換行字符,這對Unix來說是一個很好的假設,但在Mac OS/Windows上是YMMV。確保文件以換行結束,以確保不會忽略最後一行字符數。

from sys import stdin, exit 

counter = 0 
while True: 
    byte = stdin.buffer.read(1) 
    counter += 1 
    if not byte: 
     exit() 
    if byte == b'\x0a': 
     print(counter-1) 
     counter = 0 
相關問題