2

我对这类任务还很陌生,但我已经用尽了我的资源,因此正在寻求帮助。

我有一个由连接文件组成的文件。我可以使用下面的确切代码行将文件分开:

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

如果这是初步的,我很抱歉,但这可以极大地帮助日常任务 - 所以我希望有人能提供帮助。先感谢您!

4

2 回答 2

1

你几乎在那里只是在文件名前加上目录并使用字符串连接附加文件扩展名:

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
于 2013-04-29T19:35:49.153 回答
1

如果你想设置 dir 和 Filename,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。如果文件太多,您会看到类似“打开的文件过多”之类的错误消息。在这种情况下,您必须在写入新文件之前关闭最后一个文件。

于 2013-04-29T19:39:04.067 回答