linux的awk命令按列解析学习总结

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

3、awk的BEGIN和END语句,用于流程控制

1-   第一部分BEGIN会先执行,在输入文件之前执行
BEGIN{
printf " %-22s%s ", "NAME", "DISTRICT"
print "--------------------------------------"
}
#-1
#2- 第二部分 awk脚本正文,要对来自输入文件datafile的每一行都要执行一遍
/west/{count++}
{printf "%s %s %-15s ", $3, $4, $1| "sort +1" }
#-2
#3- 第三部分  输入文件关闭后awk退出之前执行
END{
close "sort +1"
printf "The number of sales persons in the western "
printf "region is " count "."   
}

命令解析:(1) $0表示文本文件test的每一行;$1表示每一行的第一列;

                     (2)数组b的key为每一行的第一列,数组b的值为第一列在所有行中出现的次数;

                     (3)数组a的key是第一列与第一列从第一行开始到当前行为止出现的次数的合起来一并成为key,其值为当前行的全部内容;

                   (4)对数组的多维下标之间使用逗号分隔的,如a[1,0]=8,内部形态为{"10":8},即10作为key,其值为8;

                    (5)学习awk数组的遍历形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值