我在目录中有一些文件:
A573R25.file_1.txt
A573R25.file_2.txt
A573R25.file_3.txt
A573R27.file_1.txt
A573R27.file_2.txt
A573R29.file_1.txt
A573R29.file_2.txt
A573R29.file_3.txt
A573R31.file_1.txt
A573R31.file_2.txt
A573R31.file_3.txt
A573R33.file_1.txt
A573R33.file_2.txt
A573R33.file_3.txt
我想在共享公共ID的所有文件上运行脚本(但是使用不同的文本分隔ID(例如A573R25
)和.txt
)。例如:
perl my_script.pl A573R25*.txt
但是,我想在bash脚本中为dir中的所有文件执行此操作。
以下是我尝试的内容:
samples+=$(ls -1 *.txt | cut -d '.' -f 1)
for ((i=0;i<${#samples[@]};++i))
do
ls -1 ${samples[i]}*.txt
完成
但在每种情况下我都得到(例如):
ls: A573R25: No such file or directory
我对第一个ID的预期输出是:
A573R25.file_1.txt
A573R25.file_2.txt
A573R25.file_3.txt
我做错了什么?
答案 0 :(得分:3)
您的样本集中需要sort -u
,它需要是一个数组:
samples+=( $( ls -1 *.txt | cut -d '.' -f 1 | sort -u ) )
以下是完整的代码和结果:
$ unset samples
$ samples+=( $(ls -1 *.txt | cut -d '.' -f 1 | sort -u ) )
$ for ((i=0;i<${#samples[@]};++i)); do ls -1 ${samples[i]}*.txt; done
A573R25.file_1.txt
A573R25.file_2.txt
A573R25.file_3.txt
A573R27.file_1.txt
A573R27.file_2.txt
A573R29.file_1.txt
A573R29.file_2.txt
A573R29.file_3.txt
A573R31.file_1.txt
A573R31.file_2.txt
A573R31.file_3.txt
A573R33.file_1.txt
A573R33.file_2.txt
A573R33.file_3.txt