使用AWK将单个文件的片段分解为多个文件,但我需要进一步的指导



我对这类任务还很陌生,但我已经用尽了我的资源,因此我伸出援助之手。

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

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

BUT -

  1. 如果可能的话,我想为输出文件指定一个目录-上面的脚本将输出文件写入"sourceFile"目录,我希望这些文件被放置在某种临时目录中。

  2. 如果输出文件可以保留它们的"sourceFile"的名称,可能在while的末尾有一个计数器保持。txt文件类型-即sourceFile1.txt,sourceFile2.txt等。

我尝试了以下方法来保留sourceFile的名称,但是没有成功:

set F=sourceFile
awk "/PATTERN/{x="F"++i;}{print > x;}" sourceFile
如果这是基本的,我很抱歉,但这可以极大地帮助日常工作-所以我希望有人可以帮助。提前感谢!

awk可以接受shell变量,如果您想设置dir和Filename:

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

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

然而,还有一件事你应该注意。你的文件中有多少PATTERN ?如果文件太多,就会看到类似"打开的文件太多"这样的错误信息。在这种情况下,您必须在写入新文件之前关闭上一个文件。

基本上就是这样了,只需在文件名前加上目录并使用字符串连接方式附加文件扩展名:

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

相关内容

最新更新