Files
根據第一個文件的第一列的所有值合併 2 個文件
我需要合併以下2個文件:
- 文件 1:
表格 REF-IO HEAD-IO DIFF-IO
測試 200 500 -300
考試 2 3 -1
期末考試 2 1 1
郵件 4 2 2
總計 208 506 -298
- 文件2:
表格 REF-SELECT HEAD-SELECT DIFF-SELECT
測試 5 7 -2
比賽 3 3 0
考試 0 7 -7
最終 12 6 6
總計 20 23 -3
合併後的文件應如下所示:
表格 REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT
測試 200 500 -300 5 7 -2
考試 2 3 -1 0 7 -7
最終 2 1 1 12 6 6
郵件 4 2 2 0 0 0
總計 208 506 -298 20 23 -3
awk ' NR==FNR {vals[$1] = $2 " " $3 " " $4; next} !($1 in vals) {vals[$1] = "0 0 0"} {$(NF+1) = vals[$1]; print} ' file2 file1
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT test 200 500 -300 5 7 -2 exam 2 3 -1 0 7 -7 final 2 1 1 12 6 6 mail 4 2 2 0 0 0 TOTAL 208 506 -298 20 23 -3
以下是如何使用
join
和保留行序、頁眉、頁腳等…join -1 2 -2 1 -a 1 -e 0 -o 1.1,1.2,1.3,1.4,1.5,2.2,2.3,2.4 \ <(sort -k2,2 <(nl -ba -nrz file1)) <(sort -k1,1 file2) | \ sort -k1,1n | cut -d\ -f2-
結果:
TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT test 200 500 -300 5 7 -2 exam 2 3 -1 0 7 -7 final 2 1 1 12 6 6 mail 4 2 2 0 0 0 TOTAL 208 506 -298 20 23 -3
這個怎麼運作:
nl -ba -nrz file1
為 中的行編號,然後在第二場編輯file1
輸出;也在第一個欄位上編輯,然後在第一個輸入的第二個欄位和第二個輸入的第一個欄位上編輯結果,將缺少的輸入欄位替換為:sort``file2``sort``join``0
000003 exam 2 3 -1 0 7 -7 000004 final 2 1 1 12 6 6 000005 mail 4 2 2 0 0 0 000001 TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT 000002 test 200 500 -300 5 7 -2 000006 TOTAL 208 506 -298 20 23 -3
然後在第一個欄位上排序
sort -k1,1n
以恢復行順序,然後cut -d\ -f2-
刪除行號。你可以進一步美化它,column
例如.... | column -t
:TABLES REF-IO HEAD-IO DIFF-IO REF-SELECT HEAD-SELECT DIFF-SELECT test 200 500 -300 5 7 -2 exam 2 3 -1 0 7 -7 final 2 1 1 12 6 6 mail 4 2 2 0 0 0 TOTAL 208 506 -298 20 23 -3