shell 中awk、if while 例子

1、if while命令写在一行中
while read a b;do echo $a $b;done < aa.txt
12 13 14
cat aa.txt
12 13 14
if [[ $i -eq 0 || $i -eq 2 ]] ;then env=10.79.40.146:80 ;else env=10.79.40.147:80 ; fi
2、awk 合并两个文件
account cdr
cat account
张三|000001
李四|000002
cat cdr
000001|10
000001|20
000002|30
000002|15
合并后的结果为
张三|000001|10
张三|000001|20
李四|000002|30
李四|000002|15
命令:awk -F | 'NR==FNR{a[$2]=$0;next}{print a[$1]"|"$2}'
解释:
NR (Number of Record) 表示awk执行所读取的数据行数
FNR (Number of Record in File) 跟NR类似,不同是awk每打开一个新文件,FNR便从0开始重新累计
3、while拼接文件
#将afile文件中的前三行与bfile中的前四行拼接在一起
while read -u3 i && read -u4 j;do
echo $i $j
done 3<afile 4<bfile
4、awk的分组求和
cat file.txt
机构名,姓名,状态,金额
江南 雷明凯 失败 420
江南 雷明勋 成功 300
江南 苟秀华 成功 60
白塔 苟应平 失败 360
白塔 苟应军 失败 180
水观 苟应辉 成功 240
水观 苟应东 失败 60
水观 苟应训 失败 120
水观 苟应勋 成功 360
石滩 侯应明 失败 300
石滩 侯兴文 成功 360
石滩 侯兴华 成功 120
要求:
1、全部金额计数和求和;
2、按状态分类计数和求和;
3、按机构名和状态计数和求和
结果如下:
12 2880 
成功 6 1440
失败 6 1440
江南 成功 2 360
江南 失败 1 420
白塔 失败 2 540
水观 成功 2 600
水观 失败 2 180
石滩 成功 2 480
石滩 失败 1 300
命令:
#!/bin/bash
echo "全部金额计数和求和"
awk '{if(NR!=1){total+=$4;sum++}}END{print total, sum}' file.txt
echo "按照状态计数和求和"
awk '{if(NR!=1){a[$3]+=$4;b[$3]++}}END{for (i in a){print i,a[i],b[i]}}' file.txt
echo "按照机构和状态计数和求和"
#NR!=1 跳过header,a[$1" "$3] 在1 3 之间加入空格,方便最后的排序
awk '{if(NR!=1){a[$1" "$3]+=$4;b[$1" "$3]++}}END{for (i in a){print i,a[i],b[i]}}' file.txt|sort -k 4

原文地址:https://www.cnblogs.com/ggbond1988/p/4797279.html