【问题标题】:Parse a tab and comma separated file [closed]解析制表符和逗号分隔的文件[关闭]
【发布时间】:2016-12-27 03:47:22
【问题描述】:

我有一个包含几千行这样的表格

A   GO:0008150,GO:0050789,GO:0050794,GO:0051726,GO:0065007
B   GO:0008150,GO:0050789,GO:0050794,GO:0051726,GO:0065007

我想按以下格式解析我的表格。

A   GO:0008150
A   GO:0050789
A   GO:0050794
A   GO:0051726
A   GO:0065007
B   GO:0008150
B GO:0050789
B GO:0050794
B GO:0051726
C GO:0065007

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 代码示例可能吗?
  • "我想按以下格式解析我的表格。"你试过什么?祝你好运。
  • 为什么是python标签?

标签: python perl ubuntu awk


【解决方案1】:

awk 很容易:只需 split() 第二列并遍历切片:

$ awk '{n=split($2, a, ","); for (i=1;i<=n;i++) print $1,a[i]}' file
A GO:0008150
A GO:0050789
A GO:0050794
A GO:0051726
A GO:0065007
B GO:0008150
B GO:0050789
B GO:0050794
B GO:0051726
B GO:0065007

【讨论】:

  • 谢谢。你能解释一下第一部分代码中的“a”是什么吗?
  • @pali 如我提供的链接所示,它是存储切片的数组。
  • 感谢您的信息
【解决方案2】:

您可以将 Python 与 re 模块一起使用。

import re
text = '''A   GO:0008150,GO:0050789,GO:0050794,GO:0051726,GO:0065007
B   GO:0008150,GO:0050789,GO:0050794,GO:0051726,GO:0065007'''
pattern = {
'A': re.compile('A\s+(GO.*)\n'),
'B': re.compile('B\s+(GO.*)\n*')
}
A = 'A  ' + '\nA  '.join(pattern['A'].findall(text)[0].split(','))
B = 'B  ' + '\nB  '.join(pattern['B'].findall(text)[0].split(','))
print A
print B

输出:

A  GO:0008150
A  GO:0050789
A  GO:0050794
A  GO:0051726
A  GO:0065007
B  GO:0008150
B  GO:0050789
B  GO:0050794
B  GO:0051726
B  GO:0065007

【讨论】:

    【解决方案3】:

    awk 没有循环,需要多字符 RS。

    $ awk -v RS=",|\n" 'NF==2{t=$1;$1=$2} {print t,$1}' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2013-04-19
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多