Bash:遍历文件中的行并使用每行的索引(在python中相当于"枚举")



我有一个包含文件路径列表的文本文件。我想遍历每一行(文件路径(,操作文件并将操作后的文件存储在一个新名称下。

要做到这一点,我想在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}"

最新更新