1、linux实现将文本文件每一行中相同第一列对应的其他列进行拼接
如:test的内容如下:
1 34
2 45
3 57
1 49
1 49
输出格式如下:
1: 34 49
2 : 45
3: 57
sort test|uniq|awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}' > test1
命令解析:(1)首先sort test|uniq实现对test文件的去重,去掉了重复的 1 49,保留不同的行;
(2)awk '{a[$1]=(a[$1]" "$2);} END{for(i in a) print i ":"a[i]}' :含义是将每一行的第一列最为数组a的key,第二列作为a的value,同时碰到相同的key,就把其值进行拼接,linux的shell的字符串拼接形式为str = (str “ ” $var),最后遍历数组a,其中i为数组a的每一个key,a[i]为key对应的值;
(3) >test1,将awk打印内容输入一个新的文件test1中。
总结:(1)通过本命令应该了解,awk中的数组,类似于python中的字典,是以key-value的形式存在,遍历的时候,下标值数组的key;(2)学习shell的字符串如何拼接,就如本来,如果写成a[$1]+=a[$1]+$2,表示将相同第一列对应的第二列进行累加,而不是字符串拼接;(3)该条命令可以替代map/reduce进行相关的文本统计汇总工作;
2、awk中数组的多维下标的理解
test内容如下:
1 45
2 56
1 57
3 59
1 34
awk '{a[$1,++b[$1]]=$0}END{for(i in a) print i " " a[i]}' test 输出:
11 1 45
12 1 57
21 2 56
13 1 34
31 3 59
命令解析:(1) $0表示文本文件test的每一行;$1表示每一行的第一列;
(2)数组b的key为每一行的第一列,数组b的值为第一列在所有行中出现的次数;
(3)数组a的key是第一列与第一列从第一行开始到当前行为止出现的次数的合起来一并成为key,其值为当前行的全部内容;
(4)对数组的多维下标之间使用逗号分隔的,如a[1,0]=8,内部形态为{"10":8},即10作为key,其值为8;
(5)学习awk数组的遍历形式。