我有一个包含文件路径列表的文本文件。我想遍历每一行(文件路径(,操作文件并将操作后的文件存储在一个新名称下。
要做到这一点,我想在file_$index下动态命名新文件,这样每个新文件都会被保存而不会被覆盖。有什么办法吗?我当前的代码是:
for j in $(cat access.txt); do bcftools view $j -include 'maf[0]>0.0 & maf[0]<0.005' -output [FILE_NAME] ; done
我不知道如何动态地更改文件名,即为file_$index。这相当于在python中对for循环进行枚举。注意:我不能使用现有的文件路径,因为这将覆盖我不想要的现有文件
在理想的情况下,我会操作文件路径($j(以提取部分路径作为新名称。但是我不确定这是否可能,所以file_$index也可以。
不要用读取的行
#!/usr/bin/env bash
index=1
while IFS= read -ru3 j; do
bcftools view "$j" -include 'maf[0]>0.0 & maf[0]<0.005' -output "${j}_$index"
((index++))
done 3< access.txt
在理想的情况下,我会操作文件路径($j(以提取部分路径作为新名称。
对于"$j"
,可以使用参数展开来操纵/提取/替换您想要/希望使用该变量的任何内容。
-ru3
是-r
-u 3
的缩写。它使用FD3
,以防bcftools
正在吃stdin,请参阅help read
((index++))
是bash中的一个算术表达式。
您可以使用以下内容来增加自己的索引:
i=$(( ${i:-0} + 1 ))
那么你的输出字符串可以是
"$j_$i"
使用while read
的简单解决方案
while read idx fpath; do
echo "$(basename $fpath)_$idx.txt"
done <<<$(cat tmp.txt | nl)
结果
a_1.txt
b_2.txt
c_3.txt
对于OP的代码
bcftools view $j -include 'maf[0]>0.0 & maf[0]<0.005' -output "${fpath}_${idx}"