【问题标题】:output a column group by another column shell通过另一个列外壳输出列组
【发布时间】:2017-12-08 22:17:16
【问题描述】:

我有一个 path.text 文件。列由“\t”分隔。
第一列和第二列是这样的:

Y123W    AB - CD - ED    ...  
Y948W    ED - WG - SG -EG  ...  
Y9368    AB - UE  ...  
Y024W    AB - UE  ...  
YOWB3    AB - CD - ED  ...  
...

我想将第一列中的元素按第二列中的唯一元素分组。应该是这样的(格式无关紧要):

AB - CD - ED:
Y123W, YOWB3, ...
AB - UE:
Y9368, Y024W, ...
ED - WG - SG -EG:
Y948W, ...
...

我首先尝试将第二列读入数组:

pathways=( $(awk -F"\t" '{print $2}' pathway.txt) )

然后我尝试对路径进行排序以获得独特的路径:

uniq=($(printf "%s\n" "${pathways[@]}" | sort -u))

但是,可能是因为第二列的元素包含空格“”,所以我得到的数组 uniq 是一团糟。

echo "${uniq[@]}" 

输出如下:

AB AB AB AB CD CD ...

我是 shell 新手。所以我只是尝试用python或R来一步一步地实现它......请帮助!非常感谢

【问题讨论】:

  • 总列数是多少?剩下的列应该如何分组?
  • 大约有 200 列。蛋白质(第一列)应该按相应的途径(第二列)分组。 @RomanPerekhrest

标签: linux shell unix


【解决方案1】:

试试:

$ awk -F'\t' '{if ($2 in a) a[$2]=a[$2]", "$1; else a[$2]=$2":\n"$1} END{for (x in a)print a[x]}' file
AB - UE:
Y9368, Y024W
ED - WG - SG -EG:
Y948W
AB - CD - ED:
Y123W, YOWB3

工作原理

  • -F'\t'

    这会将字段分隔符设置为制表符。

  • if ($2 in a) a[$2]=a[$2]", "$1; else a[$2]=$2":\n"$1

    如果第二个字段已经在数组a 中,则追加到当前字段1。如果不是,则在a 中开始一个新条目。

  • END{for (x in a)print a[x]}

    读完整个输入文件后,打印出结果。

另类

此版本使用三元语句代替if-else 语句。

$ awk -F'\t' '{a[$2]=a[$2](a[$2]?", "$1:$1)} END{for (x in a)printf "%s:\n%s\n",x,a[x]}' file
AB - UE:
Y9368, Y024W
ED - WG - SG -EG:
Y948W
AB - CD - ED:
Y123W, YOWB3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多