当我终于收到 NGS 测序的数据时,我用 Ubuntu 花了几天时间进行分析。但是,我缺乏 shell 编码的基础知识,对这种全新的语言感到不知所措。
我设法遵循管道,但仍然存在初学者的问题。
具体来说,我有一个文件夹,里面有 96 个文件,我想重命名它们。它们通常具有以下形式:
AD18_S1_R2_cat_trimmed.fastq.gz
AD19_S26_R2_cat_trimmed.fastq.gz
基本上,我试图删除样本 ID,例如_S1
和_S26
。我最近发现了星号,并成功地将它们用于以前的功能。但我无法想象如何在这里使用它们。我认为可行的方法是提取_S
和之间的表达式_R
并将其删除,同时保留R
。
如果样本 ID 的长度始终相同,我会[5-7]
删除名称中的字符。但对于某些样本,这种方法行不通。
我想了解如何做到这一点,而不是得到答案。因此,如果您同意分享解决方案,您能否向我解释如何进行此更改,以及您的代码意味着什么?
答案1
mmv
是一个很好的工具。默认情况下它没有安装,因此您可以使用以下命令安装它:
sudo apt install mmv
然后只需在保存文件的目录中运行以下命令:
mmv -n '*_*_R2_cat_trimmed.fastq.gz' '#1_R2_cat_trimmed.fastq.gz'
简化的解释:
-n
使用 (no-execute) 是为了预览更改,但不应用这些更改。如果您对输出满意,请在不使用标志的情况下重新运行该命令-n
。您想要删除第一个和第二个之间的所有内容,因此( )
_
的第一个参数是文件的一般表达式。mmv
'*_*_R2_cat_trimmed.fastq.gz'
星号是通配符,表示“匹配任意字符串”。因此,我们匹配第一个 之前的任何字符串
_
,然后匹配第一个 和第二个 之间的任何字符串_
,其余文件名保持不变。第二个参数 (
'#1_R2_cat_trimmed.fastq.gz'
) 基本上表示“使用第一个匹配项重命名”(#1
),其余部分只是我们保留的字符串部分。由于我们没有使用第二个匹配项 (#2
),因此我们有效地将其删除。
默认情况下,mmv
在后台应用更改。如果您想在进行更改时查看更改,可以使用-v
(verbose) 标志。
有关更多信息mmv
,您可以通过运行来查阅其手册页man mmv
在你的终端。
笔记:在运行任何命令之前,请务必在部分文件中对其进行测试,以确保其能够按预期工作并且不会丢失任何文件。始终备份原始文件也是个好主意。
答案2
使用rename
:
rename -n 's/^([^_]*)_S[^_]*(_.*)$/$1$2/' *.fastq.gz
-n
如果您对输出满意,请删除。
perlrename
工具使用类似于以下的 perl 正则表达式sed
:
s/pattern/replacement/modifier
将搜索模式并用替代品代替它。pattern
是一个用于匹配字符串的正则表达式。^([^_]*)_
=> 从文件名开头 (^
) 搜索直到第一个_
([^_]*
) 的任何内容并将其保存为变量(...)
以用于替换 ($1
)。S[^_]*
=> 匹配S
之后跟有 的任何非 的东西_
。(_.*)$
匹配一个_
后跟任意内容 (.*
)(再次将一个保存为变量$2
)直到字符串结尾 ($
)。
答案3
一般来说,使用正则表达式时,“少即是多”。我的意思是,避免尝试匹配整个字符串,而是专注于匹配您感兴趣的部分。在这种情况下,字母后跟一个或多个数字。这可以用 Perl 兼容正则表达式 (PCRE) 语法(该工具S
使用的语法)表示为。rename
S\d+
考虑到这一点,这里有一个更简单的rename
命令:
$ rename -n 's/_S\d+//' *fastq.gz
AD18_S1_R2_cat_trimmed.fastq.gz -> AD18_R2_cat_trimmed.fastq.gz
AD19_S26_R2_cat_trimmed.fastq.gz -> AD19_R2_cat_trimmed.fastq.gz
该命令将用空字符替换第一个 a_
后跟S
一个或多个数字 ( \d+
),从而有效地将其删除。 指示-n
不要rename
重命名任何内容,而只是打印它将执行的操作。一旦您确认此命令可以满足您的要求,请删除-n
以使命令真正重命名文件。