使用 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'
结束每一行
听说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'