AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 77700117
Accepted
pedro
pedro
Asked: 2023-12-22 03:24:39 +0800 CST2023-12-22 03:24:39 +0800 CST 2023-12-22 03:24:39 +0800 CST

根据条件反转特定字段中的字符串

  • 772

我有这个文件:

m64071_220512_054244/12584899/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
m64071_220512_054244/128321000/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA

我需要tr和reverse字段 $4 et $5 仅当$2==rev

预计 :

m64071_220512_054244/12584899/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/128321000/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA

我试过 :

perl -lpe 'if(/rev/) {$rev=/rev/;next}; if ($rev) {$F[4,5]=~tr/ATGC/TACG/; $F[4,5]=reverse $F[4,5]; print "@F"}' file 

我还尝试使用 awk (在 awk 中执行 bash 命令并打印命令输出)

awk '{
            if($2==rev)
        {
            cmd1="echo \047" $4 "\047 | rev | tr \047ATGC\047 \047TACG\047" 
            cmd2="echo \047" $5 "\047 | rev | tr \047ATGC\047 \047TACG\047"
            newVar1=((cmd1 | getline line) > 0 ? line : "failed") 
            newVar2=((cmd2 | getline line) > 0 ? line : "failed")
            close(cmd)
            print $1, $2, $3, newVar1, newVar2
        }
        else {print}
}' file
bash
  • 4 4 个回答
  • 78 Views

4 个回答

  • Voted
  1. Best Answer
    zdim
    2023-12-22T04:31:01+08:002023-12-22T04:31:01+08:00

    要遵循问题的尝试:

    perl -w -lanE'
        if ($F[1] eq "rev") { 
            for (@F[3,4]) { tr/ATGC/TACG/; $_ = reverse $_ } 
        } 
        say "@F"
    ' file
    

    可以将其放在一行中(或将其复制粘贴到大多数 shell 中),为了便于阅读,我将其展开。或者,当然,将其放入程序中,特别是如果还有更多事情要做的话。


    编辑——对问题中代码的评论

    • 要将输入字符串分解为@F数组(“自动拆分”),需要-a标志

    • 由于您明确打印需要的内容,因此使用-n标志,而不是-p

    • 该行中的字段 4 和 5 是数组元素 3 和 4

    • 我假设$F[4,5]你指的是两个数组元素(应该是 3,4)。那么,应该是@F[3,4]——并且带有-w标志,对于警告,我们会听到它

    • 更重要的是,我们不能将正则表达式或tr模式绑定到列表,而只能绑定到单个标量。为了将其应用于tr多个项目,需要对其进行迭代,如上所示。

    • 元素循环块中的代码@F[3,4]在数组的每个元素上运行,并就地修改它(因为$_只是数组元素的别名),首先是tr然后通过(反转和)分配。所有这些也可以写成

      $_ = reverse tr/ATGC/TACG/r  for @F[3,4];
      

      修饰符r使tr返回更改后的字符串,然后对其进行reverse-ed,然后通过$_别名将其分配回当前处理的数组元素

    • 3
  2. Alex Reynolds
    2023-12-22T04:09:33+08:002023-12-22T04:09:33+08:00

    这是在 Python 中执行此操作的一种方法:

    #!/usr/bin/env python
    
    import io
    import sys
    
    RECORDS_STR = '''m64071_220512_054244/12584899/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
    m64071_220512_054244/128321000/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
    m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
    m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA'''
    
    '''
    fast pure-Python reverse complement, courtesy of Devon Ryan
    ref. https://bioinformatics.stackexchange.com/a/3585/776
    '''
    DNA_TABLE = str.maketrans("ACTGactg", "TGACtgac")
    def reverse_complement(seq):
        return seq.translate(DNA_TABLE)[::-1]
    
    def main():
        records = io.StringIO(RECORDS_STR) # replace with sys.stdin etc.
        for line in records:
            elems = line.rstrip().split()
            if elems[1] == 'rev':
                elems[3] = reverse_complement(elems[3])
                elems[4] = reverse_complement(elems[4])
            sys.stdout.write('{}\n'.format('\t'.join(elems)))
    
    if __name__ == "__main__":
        main()
    

    输出:

    m64071_220512_054244/12584899/ccs   rev pet047-10055    TCACAAGGTCGCACGT    TCACAAGGTCGCACGTTTGAACCCTCAA
    m64071_220512_054244/128321000/ccs  rev pet047-10055    TCACAAGGTCGCACGT    TCACAAGGTCGCACGTTTGAACCCTCAA
    m64071_220512_054244/132186699/ccs  fwd pet047-10055    TCACAAGGTCGCACGT    TCACAAGGTCGCACGTTTGAACCCTCAA
    m64071_220512_054244/134874748/ccs  fwd pet047-10055    TCACAAGGTCGCACGT    TCACAAGGTCGCACGTTTGAACCCTCAA
    
    • 2
  3. Kaz
    2023-12-22T08:08:01+08:002023-12-22T08:08:01+08:00

    在TXR Lisp 中,使用awk宏:

    (awk ((equal [f 1] "rev")
          (each ((i 3..5))
            (upd [f i] (mapcar (relate "ATGC" "TACG")) reverse)))
         (t))
    
    txr rev.tl data
    m64071_220512_054244/12584899/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
    m64071_220512_054244/128321000/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
    m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
    m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
    
    $ diff <(txr rev.tl data) expected
    $
    
    • 1
  4. Supertech
    2023-12-22T11:12:58+08:002023-12-22T11:12:58+08:00

    如果你想尝试 Bipython(当你处理核酸序列时我强烈推荐),这里有一种方法:

    from Bio.Seq import Seq
    import re
    
    with open("input_file.txt") as f:
        for line in f:
            line = line.rstrip() # remove new line
            fields = re.split('\s', line)
            if fields[1] != 'rev':
                print(line)
            else:
                dna = Seq(fields[3])
                print(' '.join(fields[0:3]), dna.reverse_complement(), fields[4])
    
    • 0

相关问题

  • (macOS Bash) 2个看似相同的字符串并不相等,仅通过“set -x”显示差异

  • Xargs:尽管扩展了别名,但别名替换仍失败

  • Linux 环境中 $PATH 和 ${PATH:+:${PATH}} 的区别

  • awk 查找并替换为正则表达式和环境变量

  • 如何在 bash 中对任意长度的编号、分隔字母数字字符串的文件名进行零填充?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve