3

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

我想我已经掌握了使用 awk 解决问题的窍门,但我现在需要自动化一些工作,并希望我也可以使用 bash 和 awk 来做到这一点。

从另一个线程回顾一下:

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

解决方案代码为:

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 上运行上述两个命令,然后保存到保持相同文件名的新目录(如果更容易)或保存到具有新文件名的相同目录(例如:在文件名前面加上“新” )。

对我来说,最终结果是我会将所有新文件分类成一个巨大的 txt 文件并导入到数学程序中。这个导入的文件现在将具有文件名来帮助我们识别我们首先获得行的位置,并且我们将拥有将记录捆绑在一起的所有信息,以便我们可以分析。

感谢您提前提供任何帮助/指导。

4

1 回答 1

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

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

于 2013-07-30T15:26:45.193 回答