我想使用unix命令打印文本文件每行中的字符数。我知道PowerShell很简单
gc abc.txt | % {$_.length}
但我需要unix命令。
答案 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
的每一行中打印字符数。