访问名称中具有整数的变量

时间:2019-06-21 15:24:24

标签: bash awk sh

我正在尝试对两组文件(一些大量文件)进行某些操作(例如添加列)。两组文件的数量以及文件内部的数据格式相同。

  set1:          set2:
  fileA          fileX
  fileB          fileY
  fileC          fileZ


  cat fileA
  1
  2
  cat fileX
  5
  6

我正在尝试添加它们的列

 paste fileA fileX > tmpA
 awk '{print $1+$2}' tmpA > output1

 paste fileB fileY > tmpB
 awk '{print $1+$2}' tmpB > output2

我想使用for循环执行此操作。 由于文件名中没有任何数字标识, 我想做的是以下事情:

f1=dir1/fileA
f2=dir1/fileB
f3=dir1/fileC

g1=dir2/fileX
g2=dir2/fileY
g3=dir2/fileZ

for i in `seq 1 3`
do
paste $f$i $g$i > tmp
awk '{print $1+$2}' tmp > output$i
rm tmp
done

我的问题:有什么办法可以将$f$i识别为分配给文件的$f1,$f2,$f3变量?

非常感谢。

2 个答案:

答案 0 :(得分:2)

我建议使用两个数组来同时进行迭代:

f_files=(dir1/fileA dir1/fileB dir1/fileC) # or shorter :  =(dir1/file{A,B,C})
g_files=(dir2/fileX dir2/fileY dir2/fileZ) # or shorter :  =(dir2/file{X,Y,Z})

for ((i=0; i<${#f_files[@]}; i++)); do
    paste ${f_file[$i]} ${g_files[$i]} > tmp
    awk '{print $1+$2}' tmp > output$i
    rm tmp
done

我将迭代次数基于f_files数组的长度,但是请注意,它从0开始,因为数组从0开始索引,这会影响输出文件名。如果需要的话,显然可以通过一些算术来解决。

我建议还删除中间tmp文件(paste ${f_file[$i]} ${g_files[$i]} | awk ...),或者至少仅在循环结束后才删除它,因为>会覆盖文件内容。

答案 1 :(得分:1)

我真的很喜欢@Aaron的答案。 我只是建议将paste命令包含在awk命令中。 最终看起来像这样:

f_files=(dir1/fileA dir1/fileB dir1/fileC) # or shorter :  =(dir1/file{A,B,C})
g_files=(dir2/fileX dir2/fileY dir2/fileZ) # or shorter :  =(dir2/file{X,Y,Z})

for i in $(seq 0 ${#f_files[@]}); do
    awk 'NR==FNR{inp1[NR]=$1; next;} {print($1+inp1[FNR])}' "${f_files[i]}" "${g_files[i]}" > output$i
done

我添加了"${f_files[i]}""${g_files[i]}"周围的引号,以防文件名带有空格。