我想使用unix命令在文本文件的每一行中打印字符数。我知道使用Powershell很简单
gc abc.txt | % {$_.length}
但是我需要unix命令。
Answers:
使用Awk。
awk '{ print length }' abc.txt
while IFS= read -r line; do echo ${#line}; done < abc.txt
它是POSIX,因此它应该可以在任何地方使用。
编辑:添加了-r由威廉建议。
编辑:提防Unicode处理。具有正确设置区域设置的Bash和zsh将显示代码点数量,而破折号将显示字节,因此您必须检查shell的功能。然后,无论如何,Unicode还有很多其他可能的长度定义,所以这取决于您的实际需求。
编辑:带前缀,IFS=
以避免丢失前导和尾随空格。
IFS=
在read
命令上设置。这样IFS= read -r
。read
使用IFS
进行单词拆分,即使所有拆分后的单词都一起粘贴回到一个可用变量(line
)中,也不能保证它们与所有原始分隔符或只有一个潜在的不同字符一起粘贴回去那些。例如,使用默认的IFS,该行foo bar
可能变为foo bar
,失去7个空格。(就像Stack Overflow如何在此注释中失去该示例字符串中的相邻空格一样)。
IFS
应该设置,但是如果不是这样的话,问题就会更加棘手。
我已经尝试了上面列出的其他答案,但是在处理大文件时,它们与像样的解决方案相去甚远-尤其是当一行的大小超过可用RAM的约1/4时。
bash和awk都吞掉了整行,即使不需要这个问题。一旦一行太长,即使您有足够的内存,Bash也会出错。
我已经实现了一个非常简单的,未经优化的python脚本,当对大型文件(每行约4 GB)进行测试时,该脚本不会产生问题,并且是迄今为止给出的更好的解决方案。
如果这对于生产来说是时间紧迫的代码,则可以在测试这确实是一个瓶颈之后,用C重写构想或在read调用上执行更好的优化(而不是一次仅读取一个字节)。
代码假定换行符是换行符,这对于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
试试这个:
while read line
do
echo -e |wc -m
done <abc.txt
echo -e | wc -m
,不是吗?它对命令无用。Shell可以计算变量中的字符。Plusecho -e
完全不兼容,只能在一半的外壳中工作,而从某些转义序列开始在其他外壳中工作,而在其余外壳中则一无所有。