Sort

加入兩個文件,每個文件有兩列,包括不匹配的行

  • February 7, 2022

我正在嘗試匹配和合併兩組排序數據,每個文件一組。每個文件包含兩列:鍵欄位和關聯的值。結果輸出應包含三列:鍵欄位、第一個文件中的值(如果有)和第二個文件中的值(如果有)。我需要包含不匹配的數據行。

第一個文件“約翰”

apple,green
cherry,red
orange,orange

第二個文件“簡”

apple,red
banana,yellow
cherry,yellow
kiwi,green

期望的結果

apple,green,red
banana,,yellow
cherry,red,yellow
kiwi,,green
orange,orange,

我最初認為這是一項微不足道的工作join

LC_ALL=C join -j1 -a1 -a2 -t',' john jane

但是結果-a1 -a2總是將不匹配的值放在第二列中:

apple,green,red
banana,yellow
cherry,red,yellow
kiwi,green
orange,orange

我需要能夠看到不匹配的值來自哪個源文件,理想情況下是通過將這些值放在結果文件的適當第二列或第三列中,但我無法找到一種簡單的方法來實現這一點,而無需深入到awk ... getline()類型構造中。

請問有什麼建議嗎?

你想要-o auto

join -t, -j 1 -a 1 -a 2 -o auto john jane

來自man join

**-o** *FORMAT*

*FORMAT*在建構輸出線時 服從

     ︙

如果*FORMAT*是關鍵字’ auto’,那麼每個文件的第一行決定了每行輸出的欄位數。

或者從GNU Coreutils 更好地解釋:join invocation (按照連結進入join 中的 General 選項):

-o auto'

如果指定了關鍵字“ auto”,則從每個文件的第一行推斷輸出格式。這與預設輸出格式相同,但也確保每行輸出相同數量的欄位。缺少的欄位被替換為-e選項,多餘的欄位被丟棄。

% cat john 
apple,green
cherry,red
orange,orange
% cat jane 
apple,red
banana,yellow
cherry,yellow
kiwi,green
% join -t, -j 1 -a 1 -a 2 -o auto john jane
apple,green,red
banana,,yellow
cherry,red,yellow
kiwi,,green
orange,orange,

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