使用awk按指定规则输出文件内容到新文件时遇语法错误求助
AWK输出到动态文件名的语法错误修正
问题描述
有一个制表符分隔的文件,内容如下:
header1 header2 header3 header4 header5 1field1 1field2 1field3 1field4 1field5 2field1 2field2 2field3 2field4 2field5 3field1 3field2 3field3 3field4 3field5 4field1 4field2 4field3 4field4 4field5
需求是:跳过首行,将每行内容写入新文件,新文件名由第1和第5字段用下划线分隔,加上.txt后缀(比如1field1_1field5.txt)。
已能通过以下AWK命令正确输出文件名到标准输出:
awk -v FS='\t' -v OFS='_' 'NR>1 {print ($1,$5 ".txt") }'
但修改为输出到对应文件时,命令:
awk -v FS='\t' -v OFS='_' 'NR>1 {print > ($1,$5 ".txt") }'
出现语法错误:
awk: cmd. line:1: NR>1 { print > ($1,$5 ".txt") } awk: cmd. line:1: ^ syntax error
解决方法
问题出在AWK重定向的语法逻辑:($1,$5 ".txt")的写法在重定向操作中会被判定为语法歧义——AWK的重定向操作符右侧需要明确的字符串表达式,而直接将字段拼接与后缀连写无法被正确解析。
有两种可靠的修正方式:
方式1:手动拼接文件名字符串
不依赖OFS变量,直接用下划线连接字段并添加后缀:
awk -v FS='\t' 'NR>1 {print > ($1 "_" $5 ".txt") }' input.txt
方式2:用中间变量存储文件名
先将拼接好的文件名存入变量,再用于重定向,逻辑更清晰:
awk -v FS='\t' -v OFS='_' 'NR>1 {filename = $1 OFS $5 ".txt"; print > filename }' input.txt
补充(GNU AWK专属写法)
如果你使用的是GNU AWK(gawk),可以直接用OFS变量拼接字段,避免语法歧义:
awk -v FS='\t' -v OFS='_' 'NR>1 {print > ($1 OFS $5 ".txt") }' input.txt
内容的提问来源于stack exchange,提问作者Arindrew
相关产品推荐
相关产品推荐

