AWK:搜索一列,打印第二列

时间:2017-04-01 19:03:19

标签: bash awk

我有以下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列打印一个列表。

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,打印值。