比较两个文件名并提取差异

发布于 2025-01-13 10:01:37 字数 364 浏览 2 评论 0原文

我有两个文件名几乎相同的文件:

/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R1.extracted.fastq.gz
/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R3.extracted.fastq.gz

如何在 bash 中仅提取不同的字符?

所需的输出:

1 3

编辑:

  • 始终相同的长度
  • 仅考虑 _R[0-9] 中的差异

I have two files with almost identical filenames:

/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R1.extracted.fastq.gz
/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R3.extracted.fastq.gz

How can I extract in bash ONLY the different characters?

Desired output:

1 3

Edit:

  • Always the same length
  • Take into account only differences in _R[0-9]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

迎风吟唱 2025-01-20 10:01:37

仅比较一个有趣的子集

(回答编辑后的问题)

#!/usr/bin/env bash

s1='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R1.extracted.fastq.gz'
s2='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R3.extracted.fastq.gz'

revision_re='_R([[:digit:]]+)[._]'

rev1=; rev2=;
[[ $s1 =~ $revision_re ]] && rev1=${BASH_REMATCH[1]}
[[ $s2 =~ $revision_re ]] && rev2=${BASH_REMATCH[1]}

if [[ $rev1 && $rev2 ]] && [[ $rev1 != "$rev2" ]]; then
  printf '%s %s\n' "$rev1" "$rev2"
fi

比较整个字符串

(回答最初提出的问题)

#!/usr/bin/env bash

s1='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R1.extracted.fastq.gz'
s2='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R3.extracted.fastq.gz'
 
max_len=$(( ${#s1} > ${#s2} ? ${#s1} : ${#s2} ))
for (( idx=0; idx<max_len; idx++ )); do
  if [[ ${s1:idx:1} != "${s2:idx:1}" ]]; then
    printf '%s ' "${s1:idx:1}" "${s2:idx:1}"
  fi
done
printf '\n'

Comparing Only An Interesting Subset

(Answering the question as-edited)

#!/usr/bin/env bash

s1='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R1.extracted.fastq.gz'
s2='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R3.extracted.fastq.gz'

revision_re='_R([[:digit:]]+)[._]'

rev1=; rev2=;
[[ $s1 =~ $revision_re ]] && rev1=${BASH_REMATCH[1]}
[[ $s2 =~ $revision_re ]] && rev2=${BASH_REMATCH[1]}

if [[ $rev1 && $rev2 ]] && [[ $rev1 != "$rev2" ]]; then
  printf '%s %s\n' "$rev1" "$rev2"
fi

Comparing The Whole String

(Answering the question as originally asked)

#!/usr/bin/env bash

s1='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R1.extracted.fastq.gz'
s2='/home/104800-001-001/H27VNDSX3_104800-001-001_GCCTATCA-CGACCATT_L002_R3.extracted.fastq.gz'
 
max_len=$(( ${#s1} > ${#s2} ? ${#s1} : ${#s2} ))
for (( idx=0; idx<max_len; idx++ )); do
  if [[ ${s1:idx:1} != "${s2:idx:1}" ]]; then
    printf '%s ' "${s1:idx:1}" "${s2:idx:1}"
  fi
done
printf '\n'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文