awk 多文件合并,多列索引等 *** 作

awk 多文件合并,多列索引等 *** 作,第1张

例 1  索引

a.txt 文件内容如下:

b.txt文件如下

执行命令:

awk 'NR==FNR{a[$1]=$2}NR!=FNR{if($1 in a) print $1, a[$1], $2else print $1, 0, $2}' a.txt b.txt

输出结果:

参数解释:

awk 'NR==FNR{a[$1]=$2}NR!=FNR{if($1 in a) print $1, a[$1], $2else print $1, 0, $2}' a.txt b.txt

NR==FNR{a[$1]=$2}  : NR==FNR判断是否是第一个文件,如果是第一个文件执行 {a[$1]=$2 } *** 作,将a.txt第一列作为key 第二列作为value生成索引a。 这一步执行后得出的结果大概是 a={'20000401':'100000999', '20100503':'100000888'} (实际上并不是json结构)

NR!=FNR{if($1 in a) print $1, a[$1], $2else print $1, 0, $2} : 如果不是第一个文件, 这个例子中是指b.txt, 这段命令中 $1, $2 都是b.txt 中的第一、二列,逻辑很简单不解释了。

例 2. 统计

awk '{if (($3 >= 10 ) &&($3 <20)) _cnt_10+=1 else _cnt_20+=1} END {print _cnt_10, _cnt_20}' res.txt

awk '{if (($3 >= 10 ) &&($3 <20)) {_cnt_10+=1} else if($3>=0 &&$3<10) {_cnt_1+=1} else {_cnt_20+=1}} END {print _cnt_1,_cnt_10, _cnt_20}' res.txt

结果:

上面两个范围统计的例子原理不难, 主要是语法难记, 需要注意的是我的mac笔记本里不能用elif 报语法错误, 只能用else if 不知道怎么回事。

首先需要注意FNR和NR表示行号的区别:FNR是每个文件中的行号,每个文件都从第一行开始,而NR是awk处理的行号,1~N,不会从1开始,例如:

# awk '{print NR,$0}' file1 file2

1 a b c d

2 a b d c

3 a c b d

4 aa bb cc dd

5 aa bb dd cc

6 aa cc bb dd

# awk '{print FNR,$0}' file1 file2

1 a b c d

2 a b d c

3 a c b d

1 aa bb cc dd

2 aa bb dd cc

3 aa cc bb dd

所以,对不同文件同一行,比如第一行进行合并【如果是数字,进行求和】可以用:

awk 'FNR==1{sum=sum+$0}END{print sum}' file1 file2 file3 ……

如果是字符串,可以将字符串连接,例如:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11601009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存