我有一些* .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.仅将最后的结果保存在一个文件中。不会为每个文件生成结果。
有人可以帮我吗?
答案 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