如何根据字符串中的匹配项和后续字符串的长度用零填充值?
How to pad a value with zeroes based on a match in a string and the length of the following string?
我在改编之前问题的答案时遇到了一些问题,所以我希望写一个具体的解决方案是可以的。
我有一个fasta格式的RNA-reads文件,但是readname的末尾弄乱了,所以我需要更正它。
将零填充到字符串中间是一项简单的任务,但是我无法让它工作,因为我还需要确定问题的长度和位置。
我读取的文件头是这样的:
@V350037327L1C001R0010000023/1_U1
我需要搜索“/1_U”,然后将零填充到该行的其余部分,总长度为 6。
它看起来像这样:
@V350037327L1C001R0010000023/1_U000001
最后的长度应该是“/1_U”之后的六位。
例如:输入:
@V350037327L1C001R0010000055/1_U300 = /1_U000300
@V350037327L1C001R0010000122/1_U45000 = /1_U045000
我试过使用 awk,但是我无法让它检查初始长度,因此没有填充正确数量的零。
在此先感谢您,感谢您对本论坛的不懈支持
试试这个:
#! /bin/bash
files=('@V350037327L1C001R0010000023/1_U1'
'@V350037327L1C001R0010000055/1_U300'
'@V350037327L1C001R0010000122/1_U45000')
for file in "${files[@]}"; do
if [[ $file =~ ^(.*U)([0-9]+)$ ]]; then
printf '%s%06d\n' "${BASH_REMATCH[@]:1}"
fi
done
更新:这从标准输入读取文件。
#! /bin/bash
while read -r file; do
if [[ $file =~ ^(.*U)([0-9]+)$ ]]; then
printf '%s%06d\n' "${BASH_REMATCH[@]:1}"
fi
done
更新 2:在 开始 shell 编程之前,您确实应该学习 shell 编程的基础知识 。典型的基础是 conditional constructs.
#! /bin/bash
while read -f file; do
if [[ $file =~ ^(.*U)([0-9]+)$ ]]; then
printf '%s%06d\n' "${BASH_REMATCH[@]:1}"
else
printf '%s\n' "$file"
fi
done
我在改编之前问题的答案时遇到了一些问题,所以我希望写一个具体的解决方案是可以的。
我有一个fasta格式的RNA-reads文件,但是readname的末尾弄乱了,所以我需要更正它。
将零填充到字符串中间是一项简单的任务,但是我无法让它工作,因为我还需要确定问题的长度和位置。
我读取的文件头是这样的:
@V350037327L1C001R0010000023/1_U1
我需要搜索“/1_U”,然后将零填充到该行的其余部分,总长度为 6。 它看起来像这样:
@V350037327L1C001R0010000023/1_U000001
最后的长度应该是“/1_U”之后的六位。 例如:输入:
@V350037327L1C001R0010000055/1_U300 = /1_U000300
@V350037327L1C001R0010000122/1_U45000 = /1_U045000
我试过使用 awk,但是我无法让它检查初始长度,因此没有填充正确数量的零。
在此先感谢您,感谢您对本论坛的不懈支持
试试这个:
#! /bin/bash
files=('@V350037327L1C001R0010000023/1_U1'
'@V350037327L1C001R0010000055/1_U300'
'@V350037327L1C001R0010000122/1_U45000')
for file in "${files[@]}"; do
if [[ $file =~ ^(.*U)([0-9]+)$ ]]; then
printf '%s%06d\n' "${BASH_REMATCH[@]:1}"
fi
done
更新:这从标准输入读取文件。
#! /bin/bash
while read -r file; do
if [[ $file =~ ^(.*U)([0-9]+)$ ]]; then
printf '%s%06d\n' "${BASH_REMATCH[@]:1}"
fi
done
更新 2:在 开始 shell 编程之前,您确实应该学习 shell 编程的基础知识 。典型的基础是 conditional constructs.
#! /bin/bash
while read -f file; do
if [[ $file =~ ^(.*U)([0-9]+)$ ]]; then
printf '%s%06d\n' "${BASH_REMATCH[@]:1}"
else
printf '%s\n' "$file"
fi
done