本文共 1347 字,大约阅读时间需要 4 分钟。
解题思路
文件 shu 是下面这样的。
220 34 50 70553 556 32 211 1 14 98 33文件 jian是下面这样的。
1082想要得到结果是下面这样的。
210 24 40 60545 548 24 131 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 60545 548 24 131 1 12 96 31分析上述步骤
NR==FNR 处理第一个文件 next起到跳过的作用。
a[NR]=$1a[1]=10a[2]=8a[3]=2NR!=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 60545 548 24 131 1 12 96 31原文:
转载于:https://blog.51cto.com/liuzf/2055907