awk合并文件的个人理解

    xiaoxiao2021-03-25  99

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

    
    转载请注明原文地址: https://ju.6miu.com/read-22717.html

    最新回复(0)