linux - 根据存在的字符在linux中拆分文件

标签 linux bash split

我试图在论坛上找到这个问题的解决方案,但无法理解其中的一些解决方案。

我正在处理 DNA 数据,我有 2 个文件。 第一个文件 (a) 是包含所有序列标题的文件。 (姓名等) 每个标题都有自己的行。 示例:

>title1
>title2
>title3
>some other title

第二个文件 (b) 包含这些 header 的内容。 每行对应第一个文件。

GAGTTGGAAAGAG
GCTGCCCTGAGATCGTNNNN
GTGCAGTGATNNAGTG
ACTG

我正在制作一个程序来搜索序列中的未知字母。 通常你会假设文件 2 中只有字符 A C T & G。

我想制作 2 个文件:

  • 同时包含标题和序列(第一个选项卡 = 标题,第二个选项卡 = 序列)的文件,其中的条目仅包含 A C T 和 G
  • 一个同时包含标题和序列的文件(第一个选项卡 = 标题,第二个选项卡 = 序列)只是这次我们只有包含其他字母的条目。 (例如 N)

到目前为止我试过这个:

while read line; do
    echo "$line" | tr -d "A" | tr -d "C" | tr -d "T" | tr -d "G" | tr -d "\n" | wc -c
done <sequenceOnly.txt >unkownLines.txt

这计算未知字符在 (b) 文件中出现的频率。 如果此值大于 0,我想使用此行将标题 + 序列放在 unknownLines.txt 文件中,但我卡住了:/

预期输出文件 1(只有 ACTG):

>title1             GAGTTGGAAAGAG
>some other title   ACTG

预期输出文件 2(有其他内容):

>title2            GCTGCCCTGAGATCGTNNNN
>title3            GTGCAGTGATNNAGTG

最佳答案

先把数据用paste拼在一起,再用awk分开:

paste header sequence | 
    awk '$NF ~ /^[ACTG]*$/ {print > "file1"; next }1'  > file2

粘贴将数据放入两列,awk 检查最后一列是否只包含字母 ACTG。如果是,该行将写入文件 file1。 (也将打印空序列。)如果不是,则该行将写入 file2

关于linux - 根据存在的字符在linux中拆分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14464079/

相关文章:

Linux shell : space in condition statement

linux - systemtap 无法在 Ubuntu : "unable to find a suitable compile server" 上运行

c - 在 fork 和 exec 之后在父子之间共享一个文件描述符

bash - 自动解密并运行加密的 bash 脚本而不将解密的文件保存到文件系统

R- 使用列表的值作为名称将列表的列转换为不同的列(虚拟)

linux - Linux 中的性能分析

node.js - 在同级文件夹中运行 gulp 任务

PHP exec() 没有从 bash 命令获取输出

c++ - 如何在 C++ 中分割一个 wav 文件?

PHP:文本 explode ()问题