使用AWK将单个文件拆分成多个文件,但我需要进一步的指导。

3

我对这种类型的任务仍然很陌生,但是我已经用尽了自己的资源,因此寻求帮助之手。

我有一个由连接文件组成的单个文件。 我能够使用下面的准确代码行来分割这些文件:

awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile

但是 -

  1. 如有可能,我希望为输出文件指定目录 - 上述脚本会将输出文件写入“sourceFile”目录中,我希望这些文件被放置在某种临时目录中。

  2. 如果输出文件可以保留其“sourceFile”名称并带有计数器以保持.txt文件类型,则会非常有帮助 - 即sourceFile1.txt,sourceFile2.txt等。

我尝试过以下方法来保留sourceFile名称,但不成功:

set F=sourceFile
awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile

非常抱歉如果这些内容太基础,但它可以极大地帮助日常任务 - 所以我希望有人能够帮忙。提前谢谢!


可能是AWK根据模式将文件拆分为较小的文件的重复问题。 - mschilli
2个回答

2
您已经接近成功了,只需在文件名前加上目录并使用字符串连接添加文件扩展名即可:
awk '/PATTERN/{file="tmp/"(FILENAME)(++i)".txt"}{print > file}' sourceFile

我们不需要使用一个shell变量来表示输入文件,我们可以使用awk变量 FILENAME 代替它。 示例:
$ cat sourceFile 
PATTERN sf1
sf1
sf1
sf1
PATTERN sf2
sf2
sf2
PATTERN sf3
sf3
sf3

$ awk '/PATTERN/{file="tmp/"(FILENAME)(++i)".txt"}{print > file}' sourceFile

$ cat tmp/sourceFile1.txt
PATTERN sf1
sf1
sf1
sf1

$ cat tmp/sourceFile2.txt 
PATTERN sf2
sf2
sf2

$ cat tmp/sourceFile3.txt 
PATTERN sf3
sf3
sf3

谢谢Sudo,您的解决方案是我所寻找的最接近的,但输出位置仍然存在问题: awk "/PATTERN/{file="my/tmp/dir"(FILENAME)(++i)}{print > file}" srcfile >> 导致此错误:awk "/PATTERN/{file="my/tmp/"(FILENAME)(++i)}{print > file}" srcFile awk: (FILENAME=sourceFile.txt FNR=1) fatal: division by zero attempted.... 您有什么想法吗? - Josh H
GNU Awk 3.1.6 Windows 7 - 如果你提到平台时指的是其他内容,很抱歉。 - Josh H
我已经尝试了两种方法 - 要么在C:\directory中的":"处出现语法错误,要么就是除以零的错误。我知道这一定是一些简单的问题,只是我没有找到它。 - Josh H
我想到了一种解决方法,非常感谢你的帮助,因为你解决了我的文件命名问题 - 解决输出位置问题仍然有帮助,有助于我的学习。 - Josh H
@JoshH 我不熟悉 Windows 上的 awk 的细微差别,但是你尝试过使用双反斜杠 "my\\tmp\\dir"C:\\directory\\ 吗? - Chris Seymour
显示剩余3条评论

2

awk可以接受shell变量,如果你想要设置目录和文件名:

D="/path/to/newfiles/"
F="sourceFile"

awk -v d="$D" -v f="$F" '/PATTERN/{x=d f (++i)}{print > x;}' sourceFile

现在,目标目录和文件名是动态的,您可以在awk调用之前将它们设置为适当的值。

但是还有另一件事情需要注意。在您的文件中有多少个PATTERN。如果太多了,你会看到类似"too many files opened"的错误消息。在这种情况下,您必须在写入新文件之前关闭上一个文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接