如何打印文本文件每行中的字符数

时间:2012-01-09 10:00:23

标签: shell unix sed awk

我想使用unix命令打印文本文件每行中的字符数。我知道PowerShell很简单

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

但我需要unix命令。

6 个答案:

答案 0 :(得分:118)

使用Awk。

awk '{ print length }' abc.txt

答案 1 :(得分:13)

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

它是POSIX,因此它应该可以在任何地方使用。

编辑:根据William建议添加-r。

编辑:小心Unicode处理。具有正确设置的区域设置的Bash和zsh将显示代码点的数量,但破折号将显示字节 - 因此您必须检查shell的功能。然后还有许多其他可能的Unicode长度定义,所以它取决于你真正想要的东西。

答案 2 :(得分:2)

以下是使用xargs的示例:

$ xargs -d '\n' -I% sh -c 'echo % | wc -c' < file

答案 3 :(得分:2)

我已尝试过上面列出的其他答案,但在处理大型文件时,它们距离不太合适 - 特别是一旦单行的大小占用可用内存的1/4以上。

bash和awk都会淹没整条线,即使这个问题不需要。一旦线路太长,Bash就会出错,即使你有足够的内存。

我已经实现了一个非常简单,相当未经优化的python脚本,当使用大文件(每行大约4 GB)进行测试时,它不会出现问题,并且是迄今为止提供的更好的解决方案。

如果这是生产的时间关键代码,那么在测试确实是一个瓶颈之后,你可以用C语言重写想法或者在读取调用上执行更好的优化(而不是一次只读取一个字节)。 / p>

代码假定换行符是换行符,这是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

答案 4 :(得分:0)

试试这个:

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

答案 5 :(得分:-1)

请勿使用AWK,而应使用sed!通过使用sed,您可以模拟full decadic added

sed -n 's/./a/g; s/^$/0/; :c /a/! be; s/^a/1/; s/0a/1/; s/1a/2/; s/2a/3/; s/3a/4/; s/4a/5/; s/5a/6/; s/6a/7/; s/7a/8/; s/8a/9/; s/9a/a0/; /a/ bc; :e p' abc.txt

此命令在文本文件abc.txt的每一行中打印字符数。