我有一个基因型文件,我已将其拆分为 2000 多个 5K SNP 文件,方法是使用
split -d geno_file
我得到的输出是这样的:
table_subset_0001
table_subset_0002
table_subset_0003
.
.
table_subset_0099
.
.
table_subset_0999
我想删除 0 并得到
table_subset_1
table_subset_2
table_subset_3
.
.
table_subset_93
.
.
table_subset_999
有什么办法可以做到这一点吗?
答案1
使用 Perlrename
实用程序:
rename 's/_0+/_/' table_subset_*
这会将_
后面的一个或多个零字符替换为_
。
上面的内容与Perl 附带的rename
实用程序(有时称为)一起使用。prename
某些发行版rename
从util-linux
完全不兼容的实用程序安装实用程序。
如果您的系统上尚未安装 Perl 的 rename,则可能会找到安装它的方法这里
答案2
为了纯洁...
一个纯粹的bash
答案:(感谢@steeldriver)
shopt -s extglob
for file in table_subset_0*; do
mv "$file" "${file/_+(0)/_}"
done
一个纯粹的 GNUsed
答案:
ls | sed -n -r '
/^(table_subset_)0+(.*)/ ! d
s//mv & \1\2/
e
'
一个纯粹的 GNUawk
答案:
ls | awk -F '_0+' 'NF > 1 { system("mv " $0 " " $1 "_" $2) }'
答案3
为了添加到 @John1024 的解决方案,这里有一个使用标准 Bash 命令的类似解决方案:
for file in table_subset_*; do
new_name=$(echo "$file" | sed -E -e 's/_0+/_/')
mv "$file" "$new_name"
done
原理是一样的。我们迭代所有文件并将_0
其替换为_
.
答案4
您可以awk
首先使用而不是使用split
并执行另一个rename
工具。
awk 'NR%5000==1{ file=sprintf("table_subset_%d", ((++c)) )} {print >file}' geno_file
这会将geno_file
文件分割成 5K 文件块,这些文件带有数字后缀,不带前导零,但您可以随意使用0Xd
上面的 4 位长度,例如sprintf("..._%04d", ((++c)) )
或者,如果您只想将geno_file
输出文件分割为 9 个部分,那么首先split
正确使用其选项来设置从 1 开始数字后缀(默认为 0)并-a N
(生成长度为 N 的后缀(默认为 2) ),您可以简单地使用如下:
split -a 1 --numeric-suffixes=1 -l TOTALLINES/9HERE table_subset_
但仍然不要忘记awk
解决方案。