我听说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
错误计算一行,我该怎么做才能解决这个问题?
任何线索或提示都将受到赞赏。
答案 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'