gpt4 book ai didi

bash - 如何对成批文件运行命令?

转载 作者:行者123 更新时间:2023-11-29 09:12:52 25 4
gpt4 key购买 nike

我有一个目录,其中感兴趣的文件与此表达式匹配:

ls ../a2i_2_{1..96}M.sorted.DEXseq.txt
../a2i_2_10M.sorted.DEXseq.txt ../a2i_2_25M.sorted.DEXseq.txt ../a2i_2_3M.sorted.DEXseq.txt ../a2i_2_54M.sorted.DEXseq.txt ../a2i_2_69M.sorted.DEXseq.txt ../a2i_2_83M.sorted.DEXseq.txt
../a2i_2_11M.sorted.DEXseq.txt ../a2i_2_26M.sorted.DEXseq.txt ../a2i_2_40M.sorted.DEXseq.txt ../a2i_2_55M.sorted.DEXseq.txt ../a2i_2_6M.sorted.DEXseq.txt ../a2i_2_84M.sorted.DEXseq.txt
../a2i_2_12M.sorted.DEXseq.txt ../a2i_2_27M.sorted.DEXseq.txt ../a2i_2_41M.sorted.DEXseq.txt ../a2i_2_56M.sorted.DEXseq.txt ../a2i_2_70M.sorted.DEXseq.txt ../a2i_2_85M.sorted.DEXseq.txt
../a2i_2_13M.sorted.DEXseq.txt ../a2i_2_28M.sorted.DEXseq.txt ../a2i_2_42M.sorted.DEXseq.txt ../a2i_2_57M.sorted.DEXseq.txt ../a2i_2_71M.sorted.DEXseq.txt ../a2i_2_86M.sorted.DEXseq.txt
../a2i_2_14M.sorted.DEXseq.txt ../a2i_2_29M.sorted.DEXseq.txt ../a2i_2_43M.sorted.DEXseq.txt ../a2i_2_58M.sorted.DEXseq.txt ../a2i_2_72M.sorted.DEXseq.txt ../a2i_2_87M.sorted.DEXseq.txt
../a2i_2_15M.sorted.DEXseq.txt ../a2i_2_2M.sorted.DEXseq.txt ../a2i_2_44M.sorted.DEXseq.txt ../a2i_2_59M.sorted.DEXseq.txt ../a2i_2_73M.sorted.DEXseq.txt ../a2i_2_88M.sorted.DEXseq.txt
../a2i_2_16M.sorted.DEXseq.txt ../a2i_2_30M.sorted.DEXseq.txt ../a2i_2_45M.sorted.DEXseq.txt ../a2i_2_5M.sorted.DEXseq.txt ../a2i_2_74M.sorted.DEXseq.txt ../a2i_2_89M.sorted.DEXseq.txt
../a2i_2_17M.sorted.DEXseq.txt ../a2i_2_31M.sorted.DEXseq.txt ../a2i_2_46M.sorted.DEXseq.txt ../a2i_2_60M.sorted.DEXseq.txt ../a2i_2_75M.sorted.DEXseq.txt ../a2i_2_8M.sorted.DEXseq.txt
../a2i_2_18M.sorted.DEXseq.txt ../a2i_2_32M.sorted.DEXseq.txt ../a2i_2_47M.sorted.DEXseq.txt ../a2i_2_61M.sorted.DEXseq.txt ../a2i_2_76M.sorted.DEXseq.txt ../a2i_2_90M.sorted.DEXseq.txt
../a2i_2_19M.sorted.DEXseq.txt ../a2i_2_33M.sorted.DEXseq.txt ../a2i_2_48M.sorted.DEXseq.txt ../a2i_2_62M.sorted.DEXseq.txt ../a2i_2_77M.sorted.DEXseq.txt ../a2i_2_91M.sorted.DEXseq.txt
../a2i_2_1M.sorted.DEXseq.txt ../a2i_2_34M.sorted.DEXseq.txt ../a2i_2_49M.sorted.DEXseq.txt ../a2i_2_63M.sorted.DEXseq.txt ../a2i_2_78M.sorted.DEXseq.txt ../a2i_2_92M.sorted.DEXseq.txt
../a2i_2_20M.sorted.DEXseq.txt ../a2i_2_35M.sorted.DEXseq.txt ../a2i_2_4M.sorted.DEXseq.txt ../a2i_2_64M.sorted.DEXseq.txt ../a2i_2_79M.sorted.DEXseq.txt ../a2i_2_93M.sorted.DEXseq.txt
../a2i_2_21M.sorted.DEXseq.txt ../a2i_2_36M.sorted.DEXseq.txt ../a2i_2_50M.sorted.DEXseq.txt ../a2i_2_65M.sorted.DEXseq.txt ../a2i_2_7M.sorted.DEXseq.txt ../a2i_2_94M.sorted.DEXseq.txt
../a2i_2_22M.sorted.DEXseq.txt ../a2i_2_37M.sorted.DEXseq.txt ../a2i_2_51M.sorted.DEXseq.txt ../a2i_2_66M.sorted.DEXseq.txt ../a2i_2_80M.sorted.DEXseq.txt ../a2i_2_95M.sorted.DEXseq.txt
../a2i_2_23M.sorted.DEXseq.txt ../a2i_2_38M.sorted.DEXseq.txt ../a2i_2_52M.sorted.DEXseq.txt ../a2i_2_67M.sorted.DEXseq.txt ../a2i_2_81M.sorted.DEXseq.txt ../a2i_2_96M.sorted.DEXseq.txt
../a2i_2_24M.sorted.DEXseq.txt ../a2i_2_39M.sorted.DEXseq.txt ../a2i_2_53M.sorted.DEXseq.txt ../a2i_2_68M.sorted.DEXseq.txt ../a2i_2_82M.sorted.DEXseq.txt ../a2i_2_9M.sorted.DEXseq.txt

我想对 12 个批处理运行一个命令,每个批处理有 8 个文件。因此我制作了这个脚本:

#!/bin/bash

prefix="a2i_2_"
sufix="M.sorted.DEXseq.txt"

for i in {0..7}
do
a=$(($i*12+1))
b=$(($i*12+12))

ls ../$prefix{$a..$b}$sufix


done

不幸的是,这不起作用,因为 {$a..$b} 被解释为字符串而不是序列。所以我得到了这些错误...

ls: cannot access ../a2i_2_{1..12}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{13..24}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{25..36}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{37..48}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{49..60}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{61..72}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{73..84}M.sorted.DEXseq.txt: No such file or directory
ls: cannot access ../a2i_2_{85..96}M.sorted.DEXseq.txt: No such file or directory

如何以可以解释为序列的方式表达 {$a..$b}?或者至少如果您知道另一种分批分离这些文件的方法也适用于我。

作为替代方案,我可以将文件(或创建符号链接(symbolic link))移动到不同的文件夹并运行我想要的命令

#!/bin/bash

prefix="a2i_2_"
sufix="M.sorted.DEXseq.txt"

for i in {0..7}
do
a=$(($i*12+1))
b=$(($i*12+12))

for n in $(seq $a $b)

do

ln -s ../$prefix$n$sufix .


done

# And now I can run the command for each batch ...

awk '{sums[$1] += $2;} END { for (i in sums) print i " " sums[i]; }' *$sufix | sort -k1 > $prefix$a-$b$sufix.sum
rm *$sufix

done

...但我想学习更直接的方法。

感谢您的宝贵时间。

最佳答案

你需要评估你构建的表达式,例如

$ a=3;b=7; echo {$a..$b};
{3..7}

$ a=3;b=7; eval echo {$a..$b}
3 4 5 6 7

然而,这不是正确的方法。您可以使用 seq

获取值

例如

$ a=3;b=7; seq $a $b
3
4
5
6
7

既然你正在使用 awk 为什么不全力使用它,你可以消除大部分问题

例如模板解决方案

$ awk 'c==0{start=FILENAME} 
FNR==1{c++}
{sum+=$2}
c==8{print start"-"FILENAME; c=0; print sum; delete sum}' file{1..100}

它打印一批 8 的总和,文件顺序是大括号扩展。唯一的缺点是它会跳过空文件。

关于bash - 如何对成批文件运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36500373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com