如何将 sed 命令放入 while 循环中?

时间:2021-07-22 21:34:22

标签: unix sed

希望有好心人可以帮帮我!

我有一个文件 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

为简单的问题道歉...

2 个答案:

答案 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;ksh93zsh 将非常相似)不需要 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@.*/@@')
相关问题