使用substr($0, 1, 4) 获取您想在文件名中添加的4 个字符(从字符1 开始,长度为4 的子字符串):
awk '{
out = "file_" substr($0, 1, 4) ".dat" # set filename
if (out != prev) close(prev) # close previous file
print >> out # write to file
prev = out # remember filename to check on next line
}' foo.dat
文件名out 来自将字符串文字与substr 的结果相连接的结果。此变量用于确定print 的输出最终进入的文件。
>>以“追加模式”打开一个文件,这意味着如果你重新打开同一个文件,你不会丢失之前的内容。
测试一下:
$ awk '{ out = "file_" substr($0, 1, 4) ".dat"; if (out != prev) close(prev); print >> out; prev = out }' foo.dat
$ cat file_1985.dat
1985tiny dancer
1985hey jude
$ cat file_1986.dat
1986largechicken
close 的使用是防止打开太多文件的预防措施,但如果您的输入不是太大,那么您可以简化为:
awk '{ print > ("file_" substr($0, 1, 4) ".dat") }' foo.dat
关于性能,您可以尝试对输入进行排序,以避免重复打开和关闭相同的文件(尽管排序本身需要时间):
sort -s -k1.1,1.4 foo.dat | awk '{ out = "file_" substr($0, 1, 4) ".dat"; if (out != prev) close(prev); print > out; prev = out }'
这里我还将>> 更改为>,因为awk 只会打开每个文件一次。
您还可以通过缓存结果来避免每行重复一次相同的字符串连接:
{
ss = substr($0, 1, 4)
if (!(ss in outs)) {
outs[ss] = "file_" ss ".dat"
}
out = outs[ss]
if (out != prev) close(prev)
print >> out
prev = out
}
将它放在像script.awk 这样的脚本中,然后像awk -f script.awk foo.dat 这样运行。