![如何在bash中读取所有子目录并创建相应文件?](https://linux22.com/image/92992/%E5%A6%82%E4%BD%95%E5%9C%A8bash%E4%B8%AD%E8%AF%BB%E5%8F%96%E6%89%80%E6%9C%89%E5%AD%90%E7%9B%AE%E5%BD%95%E5%B9%B6%E5%88%9B%E5%BB%BA%E7%9B%B8%E5%BA%94%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有两个主要目录,即A
和B
。每个目录包含 100 个随机名称的子目录(a1,a2,.. 和 b1,b2,...)。这些子目录包含一个XY
类型的文件。X
对于特定的子目录来说,该值是相同的a1
,b1
但该Y
值是不同的。我现在可以创建一个XY
类型文件,其中仅Y
包含子目录Y
列之间的差异,例如Y = Y1(a1) - Y2(b1)
使用简单的awk
命令左右。但我不知道如何使用 bash 循环对所有子目录执行此操作。我想要一个所需的脚本,它将创建目录 1, 2,..,其中每个目录将包含一个XY
类型文件,并且XY
类型文件包含X Y(a1-b1)
在目录 1、X Y(a2-b2)
目录 2、..、X Y(a100-b100)
目录 100 中。我很新在 bash 中,所以对任何琐碎的问题表示歉意。
示意性示例可以是这样的:我有两个主目录A
和B
。A
有子目录0.3427/ 0.3514/ 0.3543/ 0.3792/...
并且B
有子目录0.4011/ 0.4014/ 0.4031/ 0.4357/...
。
0.3427/
的子目录A
包含数据文件:
0.00 -8.79583
50.00 -8.79621
100.00 -8.79961
150.00 -8.80721
200.00 -8.81845
250.00 -8.83271
300.00 -8.8495
子目录0.4011
包含数据文件:
0.00 -8.78888
50.00 -8.78954
100.00 -8.79458
150.00 -8.80459
200.00 -8.81852
250.00 -8.83561
300.00 -8.85529
现在我希望目录中应该有一个包含以下数据的1
文件:data.dat
0.00 0.00695
50.00 0.00667
100.00 0.00503
150.00 0.00262
200.00 -7e-05
250.00 -0.0029
300.00 -0.00579
这个所需的data.dat
文件只是和Y
的第一个子目录的列的差异,可以通过命令生成。现在我想对和中存在的所有其他子目录进行相同的操作。文件在目录中的哪个位置应包含of和of等列的差异。A
B
awk/paste
A
B
2
data.dat
Y
0.3514/
A
0.4014/
B
答案1
试试这个。
#!/bin/bash
# Run it in the folder containing dir A and dir B.
A=A #first dir, replace with the propper name
B=B #second dir, replace with the propper name
in_file=f #replace with propper name
out_file=data.dat
B_subs=( $(ls B | sort -n) )
i=0
cd "$A"
for d in $( ls | sort -n) ; do
a="$d"/"$in_file"
b=../"$B"/"${B_subs[$i]}"/"$in_file"
((i++))
mkdir ../"$i"
# the one below is not correct, but gives your results
# join "$a" "$b" | awk '{print $1, $3-$2}' > ../"$i"/"$out_file"
# the one below is correct
join "$a" "$b" | awk '{print $1, $2-$3}' > ../"$i"/"$out_file"
done