Files

加入:兩個文件 - 但只附加最後兩列

  • August 8, 2015

給定文件:

1.txt

1, abc, 123, 456, 789
2, lmn, 123, 456, 789
3, pqr, 123, 456, 789

2.txt

1, abc, 123, 000, 000
3, lmn, 123, 000, 000
9, opq, 123, 000, 000  

輸出.txt

ID, NAME, X,    1A,    1B,  2A,   2B   
1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789, MISSING, MISSING
3, pqr, 123, 456, 789, 000, 000
9, opq, 123, MISSING, MISSING, 000, 000 

我用這個作為參考。

我嘗試使用以下內容:

join -t , -a1 -a2 -1 1 -2 1 -o 0 -o 1.2 -o 1.3 -o 1.4 -o 1.5 -o 2.4 -o 2.5 -e "MISSING" 1.txt 2.txt

產生:

1, abc, 123, 456, 789, 000, 000
2, lmn, 123, 456, 789,MISSING,MISSING
3, pqr, 123, 456, 789, 000, 000
9,MISSING,MISSING,MISSING,MISSING, 000, 000

有什麼幫助嗎?

我不認為你join一個人可以做到。你可以這樣做:

join -t, -a1 -a2 -o0,1.2,1.3,1.4,1.5,2.2,2.3,2.4,2.5 -e MISSING 1.txt 2.txt |
 perl -F, -lape '@F[1..2]=@F[5..6] if $F[1] eq "MISSING";
                 $_=join",",@F[0..4],@F[7..8]'
  • -p: 使用 sed/awk 中的逐行讀取循環
  • -a, -F,: 像 awk 一樣,將行拆分為欄位(到@F數組中)。
  • -l: 適用於行的內容(如輸入在( )awk上拆分(但不包括在) 和( ) 在列印前附加)。RS``$/``RS``$0``ORS``$\
  • -e ...: perl$$ e $$xpression 評估每一行。
  • 然後它讀起來幾乎像英語:如果欄位 1(索引從 0 開始的第二個欄位)為“MISSING”,則欄位 1 到 2 設置為欄位 5 到 6。然後設置目前記錄的內容( $ _ is like $ awk 中的 0)到欄位 0 到 4 和 7 到 8。

實際上,寫同樣的awk東西並不復雜:

awk -F, -vOFS=, '$2 == "MISSING"{$2=$6;$3=$7}
                {print $1,$2,$3,$4,$5,$8,$9}'

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