• shell脚本,awk实现文件a的每行数据与文件b的相对应的行的值相减,得到其绝对值。


    解题思路

    文件 shu 是下面这样的。
    220 34 50 70
    553 556 32 21
    1 1 14 98 33

    文件 jian是下面这样的。
    10
    8
    2

    想要得到结果是下面这样的。
    210 24 40 60
    545 548 24 13
    1 1 12 96 31

    用awk来得到想要的结果

    [root@localhost study]# awk 'NR==FNR{a[NR]=$1;next}NR!=FNR{for(i=1;i<=NF;i++){$i>a[FNR]?$i=$i-a[FNR]:$i=a[FNR]-$i}}1' jian shu
    210 24 40 60
    545 548 24 13
    1 1 12 96 31

    分析上述步骤

    NR==FNR 处理第一个文件 next起到跳过的作用。
    a[NR]=$1
    a[1]=10
    a[2]=8
    a[3]=2

    NR!=FNR 处理第二个文件
    for(i=1;i<=NF;i++) 遍历输出 1,2,3,4
    $i>a[FNR]?$i=$i-a[FNR]:$i=a[FNR]-$i 这个相当于三目运算 如 3>1?a=1:a=2 这个表示的是当3大于1时,输出1,否则输出2

    第二个文件先处理第一行
    $1>a[1]?$1=$1-a[1]:$1=a[1]-$1 ----> 220大于10,因此执行220-10=210
    $2>a[1]?$2=$2-a[1]:$2=a[1]-$2 ----> 34大于10,因此执行34-10=24
    $3>a[1]?$3=$3-a[1]:$3=a[1]-$3 ----> 50大于10,因此执行50-10=40
    $4>a[1]?$4=$4-a[1]:$4=a[1]-$4 ----> 70大于10,因此执行70-10=60

    然后在处理第二行
    $1>a[2]?$1=$1-a[2]:$1=a[2]-$1 ----> 545大于8,因此执行553-8=545
    $2>a[2]?$2=$2-a[2]:$2=a[2]-$2 ----> 556大于8,因此执行556-8=548
    $3>a[2]?$3=$3-a[2]:$3=a[2]-$3 ----> 32大于8,因此执行32-8=24
    $4>a[2]?$4=$4-a[2]:$4=a[2]-$4 ----> 21大于8,因此执行21-8=13

    最后处理第三行
    $1>a[3]?$1=$1-a[3]:$1=a[3]-$1 ----> 1小于2,因此执行2-1=1
    $2>a[3]?$2=$2-a[3]:$2=a[3]-$2 ----> 1小于2,因此执行2-1=1
    $3>a[3]?$3=$3-a[3]:$3=a[3]-$3 ----> 14大于2,因此执行14-2=12
    $4>a[3]?$4=$4-a[3]:$4=a[3]-$4 ----> 98大于2,因此执行98-2=96
    $4>a[3]?$4=$4-a[3]:$4=a[3]-$4 ----> 33大于2,因此执行33-2=31

    所以就输出了
    210 24 40 60
    545 548 24 13
    1 1 12 96 31

  • 相关阅读:
    mysql生成随机时间
    使用JEECG心得
    嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)
    svn 的使用(二)
    Java的几个有用小Util函数(日期处理和http)
    设置UITableViewCell高度的问题
    初探排序学习笔记
    从串口设置、读取、并分析um220模块的数据
    NYOJ-47 过河问题
    Lock_sga 和 pre_page_sga 参数详解
  • 原文地址:https://www.cnblogs.com/wangyuebo/p/5907684.html
Copyright © 2020-2023  润新知