我有以下以制表符作为字段分隔符的文件:
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 个字段命名,并使用下划线分隔符。第 1 行(技术上是第 2 行)的文件将命名为“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
我已经从 10 篇不同的文章中复制/粘贴了内容才到达这里,但我的格式不正确,无法解决。
该表达式
($1,$5 ".txt")
无效。您可能认为逗号运算符将其参数连接起来
OFS
作为分隔符。但事实并非如此OFS
。当您为命令提供多个参数时,它会用作分隔符print
,但不用于表达式中。在表达式中,唯一的连接运算符是将子表达式彼此相邻。如果要连接,
OFS
则必须明确编写。您也可以只写文字,而不用
OFS
。使用任何 awk,如果每行的 $1 和 $5 字段都是唯一的,则应该执行以下操作:
否则:
这
close()
是为了避免输入过大时出现“打开文件过多”的错误。这printf "" > out
是为了清空/初始化输出文件,以防它在脚本运行前已经存在。使用 GNU awk 你可以不用
close()
:但是当脚本尝试根据需要在内部处理打开/关闭所有输出文件时,其速度会因大量输入而显著减慢。
在这种情况下
你正在调用
print
带有 2 个参数的函数,以及和$1
的连接。而在$5
.txt
没有可以存储参数的函数。您可以使用
sprintf
字符串函数来格式化并按照以下方式返回字符串