shell命令處理兩個文件中的相同部分

行完全相同

root@ae02635267dc:/workspace/autohome/test/shell/awk# cat file2.txt |shuf|head -n 2 >file2_part.txt
root@ae02635267dc:/workspace/autohome/test/shell/awk# cat file2.txt 
name1 data1 dada2 data3 data4 dada5
name2 dada6 data7 dada8
name3 data9 dada10 data11 dada12
name4 data13 dada14
name5 data15 dada16
name6 data17 data18
root@ae02635267dc:/workspace/autohome/test/shell/awk# cat file2_part.txt 
name5 data15 dada16
name3 data9 dada10 data11 dada12
root@ae02635267dc:/workspace/autohome/test/shell/awk# grep -f file2.txt file2_part.txt 
name5 data15 dada16
name3 data9 dada10 data11 dada12

行不完全相同

  • 行中部分列對應相同。如下所示,file1.txt的第二列與file2.txt的第一列對應相等。表格的第三列爲待輸出內容
file1.txt file2.txt 待輸出
no1 name1
no2 name2
no3 name2
no4 name3
no5 name4
no6 name4
no7 name4
no8 name5
no9 name6
no10 name6
name1 data1 dada2 data3 data4 dada5
name2 dada6 data7 dada8
name3 data9 dada10 data11 dada12
name4 data13 dada14
name5 data15 dada16
name6 data17 data18
no1 name1 data1 dada2 data3 data4 dada5
no2 name2 dada6 data7 dada8
no3 name2 dada6 data7 dada8
no4 name3 data9 dada10 data11 dada12
no5 name4 data13 dada14
no6 name4 data13 dada14
no7 name4 data13 dada14
no8 name5 data15 dada16
no9 name6 data17 data18
no10 name6 data17 data18
root@ae02635267dc:/workspace/autohome/test/shell/awk# awk -F " " 'NR==FNR {a[$1]=$0} NR>FNR {print $1 " " a[$2]}' file2.txt file1.txt 
no1 name1 data1 dada2 data3 data4 dada5
no2 name2 dada6 data7 dada8
no3 name2 dada6 data7 dada8
no4 name3 data9 dada10 data11 dada12
no5 name4 data13 dada14
no6 name4 data13 dada14
no7 name4 data13 dada14
no8 name5 data15 dada16
no9 name6 data17 data18
no10 name6 data17 data18
root@ae02635267dc:/workspace/autohome/test/shell/awk# awk -F " " 'NR==FNR {a[$1]=$0;next} {print $1 " " a[$2]}' file2.txt file1.txt 
no1 name1 data1 dada2 data3 data4 dada5
no2 name2 dada6 data7 dada8
no3 name2 dada6 data7 dada8
no4 name3 data9 dada10 data11 dada12
no5 name4 data13 dada14
no6 name4 data13 dada14
no7 name4 data13 dada14
no8 name5 data15 dada16
no9 name6 data17 data18
no10 name6 data17 data18
  • 命令行分析
字段 意義
NR 已經讀出的記錄數,就是行號,從1開始
FNR 各文件分別計數的行號
NR==FNR 表示讀第一個文件時的條件分支。  因爲行數相等
NR>FNR 表示讀第二個文件時的條件分支
a 存儲數據的字典型變量,所以字段值應該保持唯一,否則會被覆蓋;
$0 當前行的所有內容
$1 當前行的第一列
a[$1]=$0 以第一列作爲key值,存儲當前行的內容$0
next 忽略之後的語句,進行下一行的匹配

參考文獻:

  1. 輸出兩個文件中相同的行 
  2. Linux awk 命令

  3. AWK 技巧(取倒列,過濾行,匹配,不匹配,內置變量等)

  4. awk之NR==FNR問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章