2013-01-01 47 views
-2

我有一個要求,其中fileA包含具有多個列的行的列表,其中一列是emaillist,其名稱爲emaillist[1,2,3,..]。我已經定義了另一個文件fileB,其中我已將值賦予emailist[1,2,3,..]變量。我讀fileA並且想要讀取fileB中定義的emailist以UNIX爲基礎的兩個文件的基於字段的連接

FILEA:

XXX1 YYY1 emailist1 
XXX2 YYY2 emailist2 

FILEB:

[email protected] 
[email protected] 

shell腳本:

Read fileA 

email = $3 

這裏是我的挑戰,浩w閱讀fileB中定義的emailist1

回答

3

使用join命令:

$ cat fileA 
XXX1 YYY1 emailist1 
XXX2 YYY2 emailist2 

$ cat fileB 
emailist1 [email protected] 
emailist2 [email protected] 

$ join -1 3 -2 1 -o '1.1 1.2 2.2' <(sort fileA -k3,3) <(sort fileB) 
XXX1 YYY1 [email protected] 
XXX2 YYY2 [email protected] 

join命令所需的數據進行排序的第一,所以我們sort文件由emaillist然後column 3file 1column 1file 2-1 3 -2 1加入。 -o選項用於指定以相同方式輸出哪個字段,因爲您沒有明確指定我從fileA中的字段1和字段2以及從fileB字段2中輸入的字段2:1.1 1.2 2.2

注意:將=更改爲fileB的空間,如sed 's/=/ /' fileB

+0

只要你有'bash' 4.x的('bash' 3.2不支持[_process取代_](HTTP: //www.gnu.org/software/bash/manual/bash.html#Process-Substitution)),你可以在數據文件之前或之後使用'sed'處理'='空白映射排序。 –

+0

謝謝喬納森。它運行良好。 –

1

您需要首先閱讀fileB並將值添加到關聯數組中,然後在讀取fileA時,將第三列替換爲數組中的值。此邏輯可與awk容易地實現:

awk 'FNR==NR { sub(/=/," "); a[$1]=$2; next } $3 in a { $3=a[$3] }1' fileB fileA 

結果:

XXX1 YYY1 [email protected] 
XXX2 YYY2 [email protected]