首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将sed命令放入while循环?

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

Stack Overflow用户
提问于 2021-07-22 21:34:22
回答 2查看 61关注 0票数 1

希望有人能帮我!

我有一个文件input.list

代码语言:javascript
复制
/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之前提取这个位--我找到了一个解决方案:

代码语言:javascript
复制
sed 's/\.GATK\.recal\.bam.*//' input.list | sed 's@.*/@@' 

我现在想把它合并到want循环中,但是它不起作用.请有人看一看我做错了什么。我的尝试如下:

代码语言:javascript
复制
while read -r line; do ID=${sed 's/\.GATK\.recal\.bam.*//' $line | sed 's@.*/@@'}; sbatch script.sh $ID; done < input.list

为轻松的Q道歉..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-22 22:41:00

您可以直接使用bash (如果您正在使用该shell;ksh93zsh非常相似)可以这样做,不需要sed

代码语言:javascript
复制
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调用:

代码语言:javascript
复制
id=$(sed -e 's/\.GATK\.recal\.bam$//' -e 's@.*/@@' <<<"$line")

或者使用普通的sh

代码语言:javascript
复制
id=$(printf "%s\n" "$line" | sed -e 's/\.GATK\.recal\.bam$//' -e 's@.*/@@')
票数 0
EN

Stack Overflow用户

发布于 2021-07-22 22:51:14

您可以使用sed命令的输出作为循环的输入:

代码语言:javascript
复制
sed 'COMMAND' input.file | while read -r id ; do
    some_command "${id}"
done

也可以使用xargs来代替循环:

代码语言:javascript
复制
sed 'COMMAND' input.file | xargs -n1 some_command

ps: GNU支持以命令的形式执行s操作的结果。出于可移植性的原因,我不建议在生产中使用这种方法,但值得提及的是:

代码语言:javascript
复制
sed 's/\(.*\)\.GATK\.recal\.bam.*/sbatch script.sh \1/e' input.file
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68491742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档