我有一个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做的一步一步实现它...请帮忙!非常感谢
答案 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
中开始新条目。
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