bash& awk:遍历dir,在所有文件上运行两个单独的awk命令并保存在新目录中

时间:2013-07-29 21:41:13

标签: macos bash awk

我昨天问了一个问题并得到了很好的帮助:http://goo.gl/HfovmX

我认为我已经掌握了使用awk来解决问题,但我现在需要自动完成一些工作,并希望我能用bash和awk做到这一点。

回顾其他主题:

我正在使用Mac并且有一堆文本文件,没有唯一标识符将记录相互绑定。将它们联系在一起的唯一方法是在导入到stats包之前记下文本文件中的位置并处理它们。

解决方案代码是:

awk '/^AB1/{ab1=$0;next}/^AB2/{print $1,$2,ab1}' file01.txt > newfile01.txt

我在将文件名附加到输出文件中的$ 7位置时遇到问题,所以我运行了第二个awk命令并且它有效:

awk '{print $1,$2,$3,$4,$5,$6,FILENAME}' newfile01.txt > newnewfile01.txt

我希望能够做的是将脚本指向这些文件的目录。理想情况下,它将在所有* .txt上运行上述两个命令,然后保存到保持相同文件名的新目录(如果更容易)或使用新文件名保存到同一目录(例如:在文件名前加上'new' )。

最终的结果是我将所有新文件捕获到一个大型txt文件中并导入到数学程序中。这个导入的文件现在将具有文件名来帮助我们在第一个位置获取行的ID,并且我们将所有信息一起绑定在一行/行上,因此我们可以进行分析。

感谢您提前寻求帮助/指导。

1 个答案:

答案 0 :(得分:2)

修改您建议的解决方案,使其现在遍历当前目录中的* txt文件:

for f in *txt ; do awk '/^AB1/{ab1=$0;next}/^AB2/{print $1, $2, ab1}' "$f" > "new$f"; awk '{print $1,$2,$3,$4,$5,$6,FILENAME}' "new$f" > "newnew$f"; done

但我怀疑你想要第一个文件的文件名,而不是第二个文件:

for f in *txt ; do awk '/^AB1/{ab1=$0;next}/^AB2/{print $1, $2, ab1, FILENAME}' "$f" > "new$f"; done

最后,第一个解决方案的以下多行版本将帮助您了解正在发生的事情:

for f in *txt
do
    awk '/^AB1/{ab1=$0;next}/^AB2/{print $1, $2, ab1}' "$f" > "new$f"
    awk '{print $1,$2,$3,$4,$5,$6,FILENAME}' "new$f" > "newnew$f"
done

您可以尝试这些并根据您的具体要求进行修改。