希望有好心人可以帮帮我!
我有一个文件 input.list
:
/scratch/user/IFS/IFS001/IFS003.GATK.recal.bam
/scratch/user/IFS/IFS002/IFS002.GATK.recal.bam
/scratch/user/EGS/ZFXHG22/ZFXHG22.GATK.recal.bam
我想在 .GATK.recal.bam
之前提取该位 - 我已经找到了解决方案:
sed 's/\.GATK\.recal\.bam.*//' input.list | sed 's@.*/@@'
我现在想将它合并到一个 while 循环中,但它不起作用...请有人看一下并指导我哪里做错了。我的尝试如下:
while read -r line; do ID=${sed 's/\.GATK\.recal\.bam.*//' $line | sed 's@.*/@@'}; sbatch script.sh $ID; done < input.list
为简单的问题道歉...
答案 0 :(得分:2)
您可以使用 sed
命令的输出作为循环的输入:
sed 'COMMAND' input.file | while read -r id ; do
some_command "${id}"
done
也可以使用 xargs
代替循环:
sed 'COMMAND' input.file | xargs -n1 some_command
ps:GNU sed 支持将 s
操作的结果作为命令执行。我不建议在生产中使用它,至少出于可移植性的原因,但可能值得一提:
sed 's/\(.*\)\.GATK\.recal\.bam.*/sbatch script.sh \1/e' input.file
答案 1 :(得分:0)
您可以直接在 bash
中执行此操作(如果您使用的是该 shell;ksh93
和 zsh
将非常相似)不需要 sed
:>
while read -r line; do
id="${line##*/}" # Remove everything up to the last / in the string
id="${id%.GATK.recal.bam}" # Remove the trailing suffix
sbatch script.sh "$id"
done < input.list
至少您可以每行使用一个 sed
调用:
id=$(sed -e 's/\.GATK\.recal\.bam$//' -e 's@.*/@@' <<<"$line")
或使用普通的 sh
id=$(printf "%s\n" "$line" | sed -e 's/\.GATK\.recal\.bam$//' -e 's@.*/@@')