awk合并文件的个人理解

最近看了下awk合并文件,明白后赶紧记一下个人的理解。

用网上的例子:

a.txt内容如下:

a.txt 
100 wang man
200 wangsan woman
300 wangming man
400 wangzheng man

b.txt内容如下:

b.txt
100 90 80
200 80 70
300cat a.txt b.txt | sort -n -k1 |awk 'NR%2==1{fd1=$2"\t"$3;next}{print $0"\t"fd1}'
400 70 20

最后要合并成的内容:

100     wang    man 90  80
200 wangsan woman 80    70
300 wangming man 60     50
400 wangzheng man 70    20

分析:最终合并文件,第一列相同,剩余内容累加

个人分为两步实现:

第一步:把两个文件合并到一起,按照第一列排序

#cat a.txt b.txt | sort -n -k1

输出内容:

100 90 80
100 wang man
200 80 70
200 wangsan woman
300 60 50
300 wangming man
400 70 20
400 wangzheng man

解释:

sort  -n  表示使用纯数字排序,从小到大,数字排序必须加的参数

sort  -k1  表示按照第一列的内容进行排序


第二步:合并不同的内容

#cat a.txt b.txt | sort -n -k1 |awk 'NR%2==1{foo=$2"\t"$3;next}{print $0"\t"foo}'      

输出内容即为最终内容:

100     wang    man 90  80
200 wangsan woman 80    70
300 wangming man 60     50
400 wangzheng man 70    20

解释:

'NR%2'==1  表示行数的值对2取余等于1,即奇数行,1、3、5、7行

"\t" 表示空格,必须用双引号

foo=$2"\t"$3  表示把第二列空格第三列的值赋值给foo变量

next  表示后面的语句不执行,直接处理下一个输入行

$0  表示整行内容

因此,整句理解为:

合并后的文件逐行判断,第一行,符合取余等于1条件,将90空格80内容赋值给foo变量,碰到next函数,直接读取第二行,不符合取余等于1条件,直接执行后面大括号语句,输出整行内容+空格+foo的值,即为100 wang man+空格+90 80,后面行同理。


再举个例子,就不写解释了

a.txt内容:

李 21岁
王 23岁
张 22岁
赵 24岁

b.txt内容:

李 男
王 女
张 男
赵 女

最后输出形式:

李 21岁 男
王 23岁 女
张 22岁 男
赵 24岁 女


语句如下:

cat a.txt b.txt |sort -k1 |awk 'NR%2==0{print $1"\t"foo"\t"$2;next}{foo=$2}'






猜你喜欢

转载自blog.csdn.net/qq_33324608/article/details/61200021
今日推荐