2017-04-23 49 views
1

我有数百个大文本文件,如test1,test2,test3,.....,test100在一个文件夹中。在多个输入文件中迭代和执行Awk函数并生成不同的输出文件

这些测试文件中的每一个都有文本条目。我的工作是阅读每个文本文件,然后在每个文本文件的每一行中分割每个测试$ i文件,并创建各种新的文本文件。

例如:如果test1.txt有3个空行,那么生成的文件数将是4个文本文件,每个新文件的名称为test1.1,test1.2,test1.3,test1.4 {参考= Splitting large text file on every blank line}

我这样做是为了一个单一的文件,它完美的作品,我得到的各种文件作为test1.1,test1.2,test1.3,test1.4

awk -v RS= '{print > ("test1." NR ".txt")}' test1 

但是当我尝试这样做循环中的多个文件,

for i in {1..100}; do awk -v RS= '{print > ("test" $i "." NR ".txt")}' test$i; done 

它不起作用。我想知道,为什么$ i的值没有传入awk函数,并且它不打印不同的空分隔的单个文件,如test1.1,test1.2,test1.3 ...... test2.1 ,test2.2 ...等等...

一个问题,其中我看到的是: “文件名过长”。 参考链接:Limit on file name length in bash

请帮助我理解和解决它或一些更好的方法来完成此任务。

回答

2

只用awk:

$ awk -v RS= '{f=(FILENAME "." FNR ".txt"); print > f; close(f)}' test* 
+0

是。谢谢。这工作绝对好,但我想知道,如果我需要导出输出f =(FILENAME“。”FNR“.txt”)在不同的文件位置可以说在文件夹桌面/ tmp中,如何继续? – Linguist

+1

'f =(“/ path/to /”FILENAME“。”FNR“.txt”)' –