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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM