Files

根據第一個文件的第一列的所有值合併 2 個文件

  • July 14, 2015

我需要合併以下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

引用自:https://unix.stackexchange.com/questions/122919