您的位置:首页 > 其它

awk合并文件的个人理解

2017-03-10 17:31 148 查看
最近看了下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}'


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: