记录一些命令的用法(awk,sed,grep)

qaz a
qaz b
qaz c
qaz a
qaz b
qaz a
xsw c
xsw a
xsw b
xsw b
cde c
cde b
cde b

需求:把上述文字转换成下列这样

xsw a/1,b/2,c/1
qaz a/3,b/2,c/1
cde b/2,c/1

解决思路:

首先把原文本通过命令弄成这样
cde b/2
cde c/1
qaz a/3
qaz b/2
qaz c/1
xsw a/1
xsw b/2
xsw c/1

命令:

cat test.txt | sort | uniq -c | awk '{print $2,$3"/"$1}'
方法很多,写出一种比较简单的方法
cde b/2
cde c/1
qaz a/3
qaz b/2
qaz c/1
xsw a/1
xsw b/2
xsw c/1

然后利用awk,把$2字段追加到相同$1后。

cat test.txt | sort |uniq -c | awk '{print $2,$3"/"$2}'| awk '{if(a[$1]){b[$1]=b[$1]","$2}else{a[$1]++;b[$1]=$0}}END{for(i in b){print b[i]}}'

主要看第二个awk的内容。首先对数组a[$1]赋值,默认为空,if(a[$1])除了0和空以外都是true,当读取第一行时,if语句为false,随机给a[$1]赋值,加一加二都不影响,反正都为true。然后把$0的值给b[$1]。当a[$1]不为0或空时,把$2的值追加到b[$1]的后面。结果如下

xsw a/xsw,b/xsw,c/xsw
qaz a/qaz,b/qaz,c/qaz
cde b/cde,c/cde

转载于:https://blog.51cto.com/14157177/2364284

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值