利用三目运算和数组去重
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 # ...
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
*** 你必须十分努力,才能看起来毫不费力 ***