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

时间:2016-12-16 07:57:00

标签: wc

我听说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")

这给出了一个包含20行随机字符串的文件example.txt。因此,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错误计算一行,我该怎么做才能解决这个问题?

任何线索或提示都将受到赞赏。

3 个答案:

答案 0 :(得分:4)

在你的python代码中,你有:

    lines = '\n'.join(rd_liens)                                                                 

所以你真正写的是:

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

不幸的是,在man wc

-l, --lines
    print the newline counts 

因此你的差异。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

如果您需要正确的计数,请使用'\n'

终止每一行