我有以下TAB分隔文件:
string1 string2 string3 001 string4
string5 string6 string7 002 string8
string9 string10 string11 003 string12
string13 string14 string15 002 string16
我想使用awk打印第4列中的所有项目,并在其旁边打印第5列的匹配列表 (数字是标识符)
001 string4
002 string8, string16
003 string12
我目前的尝试失败了:
awk 'BEGIN{FS=OFS="\t"} $4 ~ /^K/ { print $4, print $5 }'
我也不知道如何实现在比赛的第2列打印一个列表。
答案 0 :(得分:1)
使用Awk
,如下所示
awk 'BEGIN{FS=OFS="\t"}{unique[$4]=(unique[$4] FS $5); next}END{for (i in unique) print i,unique[i]}' file
产生如下输出。请记住这是不保留订单,假设它无关紧要。
002 string8 string16
003 string12
001 string4
如果你担心有逗号分隔的值,请按照
进行操作awk 'BEGIN{FS=OFS="\t"}{unique[$4]=(unique[$4]?(unique[$4]","$5):($5)); next}END{for (i in unique) print i,unique[i]}' file
生成输出
002 string8,string16
003 string12
001 string4
这个想法是
Awk
一次处理一行文件,因此创建哈希地图数组unique
,其中$4
为索引,值为$5
$5
值,则会在添加了,
去限制器的情况下将值附加到现有值。三元运算符负责处理这种情况,通过查看数组元素是否具有值,如果是这样,则使用,
附加新值,或者如果为空则直接指定$5
值。END
子句打印形成的哈希映射,键和键值,它将根据需要获取值。答案 1 :(得分:0)
@tobi:@try:
awk 'FNR==NR{A[$4]=A[$4]?A[$4]","$NF:$NF;next} ($4 in A){print $4,A[$4];delete A[$4]}' Input_file Input_file
检查FNR == NR(当读取第一个Input_file时,这个条件将成立),所以创建一个名为A的数组,其索引是$ 4,并在第一次读取Input_file时将它的值与最后一列连接起来,接下来将留下所有下一个声明。然后在数组A中循环,其中包含$ 4,打印值。