我正在尝试对两组文件(一些大量文件)进行某些操作(例如添加列)。两组文件的数量以及文件内部的数据格式相同。
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
变量?
非常感谢。
答案 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]}"
周围的引号,以防文件名带有空格。