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

时间:2013-04-29 19:28:46

标签: awk split

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

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

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

但是 -

  1. 如果可能,我想指定输出文件的目录 - 上面的脚本将输出文件写入“sourceFile”目录,我希望将这些文件放在某种临时目录中。< / p>

  2. 如果输出文件可以保留它们,那将非常有用 “sourceFile”这个名字最后可能还有一个计数器 维护.txt文件类型 - 即sourceFile1.txt, sourceFile2.txt等

  3. 我已尝试以下方法来保留sourceFile名称,但它没有成功:

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

    我道歉,如果这是初步的,但这可以极大地帮助日常工作 - 所以我希望有人可以提供帮助。提前谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。如果有太多,你会看到类似“打开太多文件”的错误信息。在这种情况下,您必须在写入新文件之前关闭最后一个文件。