最近看了下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}'