OS X终端提取制表符分隔文本11-13列的awk命令问题排查
问题排查与解决方案
首先,你的awk命令存在两个关键错误,直接导致了终端看似“超时”无响应的问题:
1. 错误的代码位置:把行处理逻辑放到了BEGIN块
BEGIN块是awk在读取任何输入行之前执行的代码块,这时候还没读取input.txt的内容,$11、$12、$13都是空值。而且你没有定义处理每一行的逻辑,导致awk会一直读取文件但不输出有效内容,看起来就像“超时”卡住了。
2. 中文引号引发的语法错误
你命令里用了中文引号“ ”,shell和awk都无法识别中文引号,这会直接导致命令解析失败,也是异常的核心诱因之一。
正确的命令写法
把行处理逻辑(print语句)放到BEGIN块外面,同时使用英文引号:
awk 'BEGIN {FS="\t"; OFS=","} {print $11,$12,$13}' input.txt > output.txt
BEGIN {FS="\t"; OFS=","}:在处理文件前,设置输入分隔符为制表符,输出分隔符为逗号{print $11,$12,$13}:对每一行输入,打印第11、12、13列,用逗号分隔
额外排查点
如果执行正确命令后还是有问题,可以检查:
- 确认输入文件确实是制表符分隔:用
cat -A input.txt查看,制表符会显示为^I;如果是空格分隔,需要调整FS为" "或者/[[:space:]]+/ - 检查文件是否有异常格式:比如超大单行(没有换行符),会导致awk长时间处理一行,用
wc -l input.txt查看行数是否符合预期 - 如果文件特别大,可加上
LC_ALL=C加速(避免locale影响处理效率):LC_ALL=C awk 'BEGIN {FS="\t"; OFS=","} {print $11,$12,$13}' input.txt > output.txt
内容的提问来源于stack exchange,提问作者Peter M
相关产品推荐
相关产品推荐

