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

时间:2013-01-22 17:07:23

标签: linux bash split

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

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

>title1
>title2
>title3
>some other title

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

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,我想用这行把header + sequence放在unknownLines.txt文件中,但是我被卡住了:/

预期输出文件1(仅限ACTG):

>title1             GAGTTGGAAAGAG
>some other title   ACTG

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

>title2            GCTGCCCTGAGATCGTNNNN
>title3            GTGCAGTGATNNAGTG

1 个答案:

答案 0 :(得分:2)

首先,将数据与粘贴放在一起,然后用awk分开:

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

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