利用三目运算和数组去重

data:

stra b
stra c
stra d
strb 1
strb 2
strb 3

 

期望结果:

stra
b
c
d
strb
1
2
3

 

脚本:

awk '{print a[$1]++?$2:$1RS$2}' data
# a?b:c 三目运算符:a为条件,a真, 则执行b; a假, 则执行c
# 读入第一行a[stra]=0, 为假, 则打印$1RS$2,即 stra\nb
# 读入第二行a[stra]=1, 为真, 打印$2, 即 c
# ...
# 当读取到 a[strb]=0时, 为假, 则打印$1RS$2,即 strb\n1
# 读入第二行a[strb]=1, 为真, 打印$2, 即 2
# ...
View Code

 

awk '{a[$1] = a[$1]RS$2}END{for(i in a)print i,a[i]}' data
# 此方法更通用,不需考虑第一列是否是有序的
# 读入第1行时,a[stra]="" 为空,执行完后,a[stra]=RS$2,即\nb
# 读入第2行时,a[stra]=\nb\nc
# 读入第3行时,a[stra]=\nb\nc\nd
# 读入第4行时,a[strb]="" 为空,执行完后,a[strb]=RS$2,即\n1
# 读入第5行时,a[strb]=\n1\n2
# 读入第6行时,a[strb]=\n1\n2\n3

# END打印
# i in stra, strb
# a[stra]=\nb\nc\nd
# a[strb]=\n1\n2\n3 
View Code

 

posted @ 2020-05-26 09:59  bigtree2pingping  阅读(156)  评论(0编辑  收藏  举报