使用awk按第86列分割1.2GB大TXT文件遇问题求助
大TXT文件分割问题解决与疑问解答
一、awk分割命令失效的修复(Windows环境)
你原来的命令在Windows下无法得到预期结果,是两个语法问题导致的:
- 变量被cmd提前解析:
$86会被Windows命令行当成环境变量解析,根本没传给awk。要把$86用双引号包起来,变成"$86",让cmd原封不动把它交给awk处理。 - 不必要的转义:
.txt前面的反斜杠是多余的,直接写".txt"就行。
修正后的命令(cmd下执行):
awk "BEGIN { OFS = \"\t\" } { print > \"$86.txt\" }" filename
另外,处理2.3亿行的超大文件,建议用GNU awk(gawk)替代Windows默认的awk,性能会好很多。
二、你的两个疑问解答
1. awk会把空格当空列移除吗?
默认情况下awk的字段分隔符是任意空白字符(空格、制表符都算),如果你的文件是严格制表符分隔,必须手动指定FS为制表符,否则awk会把空格也当成列分隔符,导致列数识别混乱,甚至把带空格的列拆成多列,空列也可能被合并。
必须在命令里加上FS的设置,比如:
awk "BEGIN { FS = \"\t\"; OFS = \"\t\" } { print > \"$86.txt\" }" filename
这样awk只会把制表符当成分隔符,空格会保留在列内容里,不会被当成空列移除。
2. 工具统计最后一列是55,和实际86列不符?
这绝对是分隔符识别错误:你用的工具默认把所有空白字符(空格+制表符)都当成列分隔符,而你的文件里某些列本身包含空格,工具就会把这些空格当成列的边界,统计出来的列数自然比实际少。
要验证真实列数,用awk跑这条命令:
awk "BEGIN { FS = \"\t\" } { print NF; exit }" filename
NF是awk的内置变量,代表当前行的字段数,这条命令会输出第一行的实际列数,能准确确认你的文件是不是真的有86列。
超大文件处理的优化建议
2.3亿行的文件,awk默认会一直打开所有输出文件,容易耗尽文件句柄导致报错。可以加上close(file)来主动关闭文件:
gawk "BEGIN { FS = \"\t\"; OFS = \"\t\" } { file = $86 \".txt\"; print >> file; close(file) }" filename
这样每写完一行就关闭文件,避免句柄溢出。
内容的提问来源于stack exchange,提问作者Park Chan Seul
相关产品推荐
相关产品推荐

