由另一个列shell

时间:2017-12-08 22:17:17

标签: linux shell unix

我有一个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做的一步一步实现它...请帮忙!非常感谢

1 个答案:

答案 0 :(得分:0)

尝试:

$ 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中开始新条目。

    < / LI>
  • 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