【问题标题】:Linux combine two different text filesLinux结合了两个不同的文本文件
【发布时间】:2014-10-20 08:21:55
【问题描述】:

我想使用awksed 或其他工具实现如下功能。

  1. 比较两个文件(File1、File2)的 ID。
  2. 如果相同的 ID 将相同的数据从 File2 带到 File1。

例如如下,

第一个文件名:File1.txt
内部(制表符分隔的表格格式)

ID      Match     Length
100      OK        1000
200      OK        1000
300      OK        2000
400      OK        2000
500      OK        3000

第二个文件名:File2.fasta
该信息包含如下信息

>100
ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTG
>200
CTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGA
>300
TGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGAC
>400
GACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACT
>500
ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTG

所以我想从 File2.fasta 再扩展一列到 File1.txt 文件 所以这是最终结果

ID      Match     Length     Sequence
100      OK        1000     ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTG
200      OK        1000     CTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGA
300      OK        2000     TGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGAC
400      OK        2000     GACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACT
500      OK        3000     ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTG

有人对如何合并这两个文件有什么好的想法吗?

【问题讨论】:

  • 我相信您正在寻找加入。假设您可以格式化 fasta 序列以也使用相同的分隔符。看到这个问题stackoverflow.com/questions/15242791/…
  • 您好,感谢您的回答!我认为几乎接近,但只有不同的第一个文件由 \t 分隔,但第二个文件由 \n 分隔,谢谢!
  • 为了完整起见,我添加了一个应该为您解决这个问题的答案。你只需要先格式化。

标签: python linux perl awk sed


【解决方案1】:

我相信你正在寻找加入。

首先,您需要对文件进行排序,并采用通用格式(相同的分隔符)。

cat File2.fasta |sed 's/$/\t/g'|tr -d '\n' |sed 's/>/\n/g'|sort > File2.fasta.sorted
cat File1.txt|sort > File1.txt.sorted

那么,你只需要像这样加入:

join -a1 -t'$TAB' File1.txt.sorted File2.fasta.sorted

注意这里 $TAB 的意思是制表符。

这将产生如下内容:

100 OK  1000    ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTG    
200 OK  1000    CTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGA    
300 OK  2000    TGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGAC    
400 OK  2000    GACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACT    
500 OK  3000    ACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTGACTG    
ID  Match   Length

这是您想要的(列名/位置除外)。

【讨论】:

  • 谢谢你的回答我得到了类似join的错误:join: multi-character tab `$TAB' 你知道它是什么吗?
  • 是的,$TAB 是一个占位符。它应该替换为文字选项卡。 '\t' 不起作用,但按 control+v 然后按 tab 会。它在终端中看起来像 ' '。
【解决方案2】:

IFS=$(echo -en "\n\b") && i=1 && for a in $(cat File1.txt); do ((i)) && echo "$a Sequence" && i=0 || echo "$a $(sed -n "/$(echo $a | awk '{print $1}')/{n;p}" File2.fasta)"; done && unset IFS

循环文件,第一行只执行一次新标题,之后它使用 sed 查找匹配后的下一行并将其回显到新列上。

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2014-10-28
    • 2017-06-19
    • 2017-01-29
    相关资源
    最近更新 更多