我遇到以下問題。根據特定列在兩個文件之間創建差異
說我有2個文件:
A.TXT
1 A1
2 A2
B.txt
1 B1
2 B2
3 B3
我要讓這是僅基於第一列的值差異,所以結果應該是
3 B3
在linux中如何用bash解決這個問題?
我遇到以下問題。根據特定列在兩個文件之間創建差異
說我有2個文件:
A.TXT
1 A1
2 A2
B.txt
1 B1
2 B2
3 B3
我要讓這是僅基於第一列的值差異,所以結果應該是
3 B3
在linux中如何用bash解決這個問題?
[ awk ]是你的朋友
awk 'NR==FNR{f[$1];next}{if($1 in f){next}else{print}}' A.txt B.txt
或者更簡單地說
awk 'NR==FNR{f[$1];next}!($1 in f){print}' A.txt B.txt
,甚至更簡單
awk 'NR==FNR{f[$1];next}!($1 in f)' A.txt B.txt
的解釋有點C會不會ertainly幫助
NR
& FNR
是AWK內置其中代表total number of records - including current - processed so far
和total number of records - including current - processed so far in the current file
分別變量,它們將只對處理的第一個文件相同。
f[$1]
首先創建數組f
,然後將$1
作爲密鑰添加,如果相同的密鑰尚不存在。如果沒有賦值,那麼f [$ 1]會自動初始化爲0,但是這方面沒有在您的案例中找到用處
next
轉到下一條記錄,而沒有處理awk腳本的其餘部分。
{if($1 in f){next}else{print}}
部分將僅針對第二個(及其後的文件)進行處理。$1 in f
檢查該鍵$1
存在陣列f
if-else-print
部分是自解釋的。{print}
被省略,因爲awk的默認動作是打印!這樣在bash
,但只有當你真的不在第二列在所有感興趣:
diff <(cut -f1 -d" " A.txt) <(cut -f1 -d" " B.txt)
awk 'NR==FNR{array[$1];next} !($1 in array)' a.txt b.txt
3 B3
或者更簡單地'的awk「NR == FNR { f [$ 1];下一個}!(f中$ 1)'' – 123
@ 123:我敢打賭,你很擅長這個.. :) Thankyou會將它添加到解決方案中 – sjsam