【问题标题】:Bash code to struture proteomics data构建蛋白质组学数据的 Bash 代码
【发布时间】:2017-12-21 15:09:13
【问题描述】:

我需要有关重组数据集的帮助,以便执行下游分析。我目前正在处理蛋白质组学数据并希望进行比较分析。问题是蛋白质ID。一般来说,一种蛋白质可以有超过 1 个 id,它们由“;”分隔。我需要打印具有不同蛋白质 ID 的同一蛋白质的整行。例如:-

输入文件:

        tom dick harry  jan
a;b;c   1     2    3     4
d;e     4     5    7     3

理想的输出:

    tom dick harry jan
a   1   2   3   4
b   1   2   3   4
c   1   2   3   4
d   4   5   7   3
e   4   5   7   3

提前非常感谢

【问题讨论】:

  • 你为什么用 R 标记这个?

标签: linux bash awk grep


【解决方案1】:
$ awk 'NR==1{$0="key "$0} {split($1,a,/;/); for (i=1; i in a; i++) { $1=a[i]; print } }' file | column -t
key  tom  dick  harry  jan
a    1    2     3      4
b    1    2     3      4
c    1    2     3      4
d    4    5     7      3
e    4    5     7      3

如果你不喜欢它,你可以从输出中简单地删除单词“key”,但恕我直言,有些列有标题,有些没有标题是一个非常糟糕的主意 - 只会让任何进一步的处理变得更加困难。

【讨论】:

  • 感谢您的即时回复。我已经尝试了您建议的代码并且它有效。唯一的问题是新生成的数据集确实根据“;”拆分了“键”并创建了一个新行,但不知何故未能打印这些行,因此将它们留为空白(第一行除外)。例如:在 a;b;c 之间,它只为“a”打印,其中 b 和 c 虽然是分开的,但是是空行。您对此的输入将对我有益。非常感谢
  • 听起来您的输入文件有问题。也许它是在 Windows 上生成的,因此包含 control-Ms?尝试在输入文件上运行dos2unix 或类似内容,然后再在其上运行 UNIX 工具。
【解决方案2】:
#!/bin/bash

read header
printf "%4s %s\n" "" "$header"

while true
do
  read ids values
  for id in $(tr ';' ' ' <<< "$ids")
  do
    printf "%-4s %s\n" "$id" "$values"
  done
done

这会读取标题并打印(格式略有不同),然后读取每一行并为每一行打印一堆行,每个id 在行首给出一行。为了找到ids,ids 字符串用分号 (;) 分割。

【讨论】:

  • 阅读unix.stackexchange.com/questions/169716/… 了解不这样做的一些原因。
  • 我已经知道所有给出的推理,但我仍然发现循环方法是这种情况下的最佳解决方案。通常一个完美的解决方案也可以处理空字节(根本不应该在输入中)或像机器代码一样高性能,并不是解决手头具体问题的最佳解决方案。实施时间通常是最有价值的方面。除非提出类似的小解决方案,否则我会坚持我的。
  • wrt Unless a similarly small solution is presented, I stick to mine - the solution I posted 更简洁、更便携、更健壮、更易于增强,并且运行速度将提高几个数量级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多