如何加载文件并将所有结果放入bash中的单独文件中?

时间:2019-02-14 23:31:25

标签: bash parallel.foreach

我有一些* .afa格式的文件。我需要删除它们之间的空白,并且我有一个专用的工具。 这是一个事实。 fac中的命令是:

fac -g inputFile.afa outputFile.afa

它运行良好。但是现在我需要自动处理100xx文件,并且要编写脚本。但是结果是,我需要一个不变的输入文件,并将文件名R放在文件名R的首位。 例如:

Before:
1.afa 30kb
2.afa 30kb
3.afa 40kb

After:
1.afa 30kb
R1.afa 15kb
2.afa 30kb
R2.afa 15kb
3.afa 40kb
R3.afa 20kb

重击对我来说是陌生的。我知道我应该学习,并且会,但是我需要快速取得结果。 现在,我就这样写:

#!/bin/bash
ls *.afa | parallel "fac -g {} >{R.}.afa"

但是: 1.我无法编写适当的正则表达式来在第一个字母的R中的新文件中打印结果 2.仅将最后的结果保存在一个文件中。不会为每个文件生成结果。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:4)

您无法为parallel编写正确的正则表达式的原因是不涉及任何正则表达式。 {}只是用引号引起来。如果您想在R之前加上R{}

#!/bin/bash
parallel "fac -g {} R{}" ::: *.afa

由于从ls开始的管道传输不被认为是一种好习惯,因此本示例使用了全局扩展。

答案 1 :(得分:2)

假设您位于所有.afa文件所在的文件夹中,则应该能够在bash shell中的一行中执行此操作:

l=($(ls *.afa)); for f in ${l[@]}; do fac -g $f "R$f"; done
# Should also work without "" around R$f.

正如@codeforester指出的那样,这样做更好(更安全):

for f in *.afa; do fac -g $f "R$f"; done

这可以扩展为:

l=(*.afa) # bash array for all .afa files.
for f in ${l[@]}; do # loop over array
    fac -g $f R$f; # Run original command for each $f
done