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


82

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

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

但是我需要unix命令。

Answers:


152

使用Awk。

awk '{ print length }' abc.txt

2
这比将wc -c应用于每行快几个数量级!
aerijman18年

对于这种类型的问题,@ aerijman的创建数量通常是使性能差异最大的原因。
MarcH

如果文件中的一行包含表情符号,则不会产生预期的长度。
user5507535 '19

@ user5507535,这取决于您实际期望的“长度”。Unicode有很多可能的定义(mawk使用字节,未检查gawk)。
Jan Hudec

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

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

编辑:添加了-r由威廉建议。

编辑:提防Unicode处理。具有正确设置区域设置的Bash和zsh将显示代码点数量,而破折号将显示字节,因此您必须检查shell的功能。然后,无论如何,Unicode还有很多其他可能的长度定义,所以这取决于您的实际需求。

编辑:带前缀,IFS=以避免丢失前导和尾随空格。


+1,但是...如果输入包含“ \”,则此操作将失败。使用read -r
William Pursell,2012年

如果文件中的一行包含表情符号,则不会产生预期的长度。
user5507535 '19

@ user5507535,实际上,这取决于您期望的“长度”。Unicode有很多可能的定义(但在这种情况下,不同的外壳实际上会做不同的事情)。
Jan Hudec

要读取任意数据时,请始终IFS=read命令上设置。这样IFS= read -rread使用IFS进行单词拆分,即使所有拆分后的单词都一起粘贴回到一个可用变量(line)中,也不能保证它们与所有原始分隔符或只有一个潜在的不同字符一起粘贴回去那些。例如,使用默认的IFS,该行foo bar可能变为foo bar,失去7个空格。(就像Stack Overflow如何在此注释中失去该示例字符串中的相邻空格一样)。
mtraceur

@mtraceur,文档明确指出“剩余单词及其中间的分隔符被分配给姓氏”,因此它们确实会与原始分隔符一起粘贴回去。但是,这并不能解决确实丢失的前导尾随定界符。因此,您是对的,IFS应该设置,但是如果不是这样的话,问题就会更加棘手。
Jan Hudec

4

我已经尝试了上面列出的其他答案,但是在处理大文件时,它们与像样的解决方案相去甚远-尤其是当一行的大小超过可用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

1
问题是一个“文本”文件。我认为每行4GB的存储空间不适合文本文件的任何合理定义。
MarcH

3

这是使用示例xargs

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

此“ echo%”不处理需要从shell引号引起来的不安全字符。另外,“ xargs”将按空格和换行符分割文件,而不仅仅是原始海报要求的换行符。

1

试试这个:

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

你的意思是echo -e | wc -m,不是吗?它对命令无用。Shell可以计算变量中的字符。Plusecho -e完全不兼容,只能在一半的外壳中工作,而从某些转义序列开始在其他外壳中工作,而在其余外壳中则一无所有。
Jan Hudec 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.