2012-01-09 96 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 
相关问题