如何根据字符串中的匹配项和后续字符串的长度用零填充值?

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