使用 wc -l 和 cat -n 计算文件行号时的不同结果

Different result when count line number of a file, using wc -l and cat -n

听说wc -l可以统计一个文件的行数。但是,当我用它来计算由 Python 生成的文件的行数时,它给出了不同的结果,错误地计算了一行。

这是 MWE。

#!/usr/bin/env python                                                                                   

import random                                                                                           

def getRandomLines(in_str, num):                                                                        
    res  = list()                                                                                       
    lstr = len(in_str)                                                                                  
    for i in range(num):                                                                               
        res.append(''.join(random.sample(in_str, lstr)))                                                
    return res                                                                                          

def writeRandomLines(rd_lines, fname): 
    lines = '\n'.join(rd_liens)                                                                 
    with open(fname, 'w') as fout:                                                                      
        fout.write(lines)                                                                                                                                      

if __name__ == '__main__':                                                                              
    writeRandomLines(getRandomLines("foobarbazqux", 20), "example.txt")

这给出了一个文件 example.txt,其中包含 20 行随机字符串。因此,example.txt 中的行数预期为 20。但是,当有人对其应用 wc -l 时,它会给出 19 作为结果。

$ wc -l example.txt
19 example.txt

当用cat -n显示文件内容时,加上行号,可以看到

$ cat -n example.txt
     1  oaxruzaqobfb
     2  ozbarboaufqx
     3  fbzarbuoxoaq
     4  obqfarbozaxu
     5  xoqbrauboazf
     6  ufqooxrababz
     7  rqoxafuzboab
     8  bfuaqoxaorbz
     9  baxroazfouqb
    10  rqzafoobxaub
    11  xqaoabbufzor
    12  aobxbaoruzfq
    13  buozaqbrafxo
    14  aobzoubfarxq
    15  aquofrboazbx
    16  uaoqrfobbaxz
    17  bxqubarfoazo
    18  aaxruzofbboq
    19  xuaoarzoqfbb
    20  bqouzxraobfa

为什么 wc -l 算错了一行,我该如何解决这个问题?

如有任何线索或提示,我们将不胜感激。

在您的 python 代码中,您有:

    lines = '\n'.join(rd_liens)                                                                 

所以你真正写的是:

word1\nword2\n...wordX-1\nwordX

不幸的是,在 man wc:

-l, --lines
    print the newline counts 

因此你与众不同。

显然 wc -l 需要在行尾看到 \n 才能将其算作一个。您当前格式的最后一行没有尾随 \n,因此不计入 wc -l。添加换行符,它应该是固定的。

wc -l 只计算换行符的个数。 由于您要附加带有 '\n' 个字符的行,因此仅使用 19 个 '\n' 个字符来连接 20 行。因此结果为 19.

如果您需要正确计数,请以 '\n'

结束每一行