2017-07-18 110 views
0

首先,我的英語很抱歉,我知道AWK有很多不同的主題,但對我來說這是一個非常困難的功能...... 我想合併兩個使用常見用awk列。這些表格的行數不同。我有我想要修改的第一張表格,第二張表格是參考表格。我想比較我的colunme1.F1和我的。匹配時,在我的file1中添加column2.F2。但我需要保留我所有的線路file1如何使用awk合併2個表

我給你舉個例子:

文件1

Num_id,Name,description1,description2,description3 
?,atlanta_1,,,  
RO_5,babeni_SW,,,   
? ,Bib1,,,   
RO_9,BoUba_456,,,   
?,Castor,,,   

文件2

official_Num_id,official_Name 
RO_1,America 
RO_2,Andre 
RO_3,Atlanta 
RO_4,Axa 
RO_5,Babeni 
RO_6,Barba 
RO_7,Bib 
RO_8,Bilbao 
RO_9,Bouba 
RO_10,Castor 

文件3

Num_id,Name,description1,description2,description3,official_Name 
?,atlanta_1,,, 
RO_5,babeni_SW,,,Babeni 
?,Bib1,,, 
RO_9,BoUba_456,,,Bouba 
?,Castor,,, 

我讀了很多關於互聯網解決方案,似乎awk可以工作。 我試過awk 'NR==FNR {h[$1] = $2; next} {print $0,h[$1]}' $File1 $File2 > file3 但是我的命令不起作用,我的File3看起來正是File1

第二次,我不知道是否有可能比較我的兩個第二列,當名稱有區別像atlanta_1和亞特蘭大,並在我的File1中添加official_num_id和official_name。

那邊有英雄嗎?

+0

'file3'中的逗號計數不正確。 –

回答

1

你有它,除了兩件小事。首先,您需要將您的文件分隔符設置爲,;第二,反向在命令行中輸入文件的順序,以便參考文件,首先處理:

$ awk 'BEGIN {FS=OFS=","} NR==FNR {h[$1] = $2; next} {print $0,h[$1]}' File2 File1 
Num_id,Name,description1,description2,description3, 
?,atlanta_1,,,, 
RO_5,babeni_SW,,,,Babeni 
? ,Bib1,,,, 
RO_9,BoUba_456,,,,Bouba 
?,Castor,,,, 
+0

謝謝,它的作品!其實我有「;」而不是「,」我沒有注意到,在你的帖子之前..我不明白的東西,我的第四列不會出現在第四列,但在我的第二個柱子裏面,想法爲什麼? –

+0

我找到了原因,這是因爲我的輸出文件中有字符^ M。使用awk -v RS ='\ r \ n'...解決我的問題 –

1

您也可以使用此join命令:

join --header --nocheck-order -t, -1 1 -2 1 -a 1 file1 file2 
0

要回答你的問題如果有可能比較我的兩個第二柱體時的名字有像atlanta_1和亞特蘭大的差異,並添加official_num_id和official_name在我的文件1

$ awk ' 
BEGIN { FS=OFS="," } 
NR==FNR {             # file2 
    a[tolower($2)]=$0          # hash on lowercase city 
    next 
} 
{               # file1 
    split($2,b,"[^[:alpha:]]")        # split on non-alphabet 
    print $0 (tolower(b[1]) in a?OFS a[tolower(b[1])]:"") 
}' file2 file1 
Num_id,Name,description1,description2,description3 
?,atlanta_1,,,,RO_3,Atlanta 
RO_5,babeni_SW,,,,RO_5,Babeni 
? ,Bib1,,,,RO_7,Bib 
RO_9,BoUba_456,,,,RO_9,Bouba 
?,Castor,,,,RO_10,Castor 

split將在atlanta_1劈在非字母字符Name領域,即_1Bib1等,所以可能在split因此無法與破折號等城市,編輯花樣[^[:alpha:]]。標題與這些名稱不匹配,請重新考慮標題名稱。

+0

非常感謝。這非常好!你能解釋一下我分裂後的第二部分嗎?我瞭解這個概念,但不是每個參數..!你也告訴我,如果名字有衝刺,我會遇到問題。如果我有像巴巴尼軟件的空間,我會有同樣的概率?事實上,我們的目標是將所有名稱標準化,以便我可以找到很多不同的情況。 –

+0

由於「拆分」拆分@任何非字母字符(目前以上面的代碼),例如比利時城市Knokke-Heist(謝謝維基)將被錯誤地拆分爲Knokke。你可以通過加入「[^ [:alpha:] - ]」來避開,但不能再用它作爲特殊字符。如果名稱中有空格的城市,則會產生錯誤的輸出。只是測試它。 –

+0

使用_second part_我假設你的意思是'print'。它從'file1'打印當前記錄('$ 0'),將'split'城市名稱的第一部分(例如babani)轉換爲小寫形式,在'file2'的散列中查找,如果找到,在$ 0之後輸出。它被稱爲_conditional operator_:'(如果是true?則返回this:else this)'。 –