2014-02-23 79 views
1

我有格式的user.txt文件,定義的變量:在格式用sed awk來替換在另一個文件

User:CityID 
Carl:0212 
Syd:0312 
Rick:9323 

和city.txt文件

Anaheim:0212 
San Jose:0312 

我需要將users.txt中的每個CityID替換爲city.txt文件中的城市名稱。 如何使用sed和awk實現這個功能?

我可以用awk獲得CityID的欄中使用:

awk -F$'\:' '{print $2}'< users.txt 

但如何將其與相應的城市名替換它們?

謝謝。

+2

當您重定向來自文件'awk'...'

回答

5

這會工作:

awk 'BEGIN{FS=OFS=":"}NR==FNR{a[$2]=$1;next}{$2=a[$2]}1' city.txt user.txt 
  • BEGIN{FS=OFS=":"}:我們的輸入和輸出字段分隔符設置爲:

  • NR==FNR{a[$2]=$1;next}:我們看這個城市的文件,並創建一個數組來存儲城市名稱索引在城市ID

  • {$2=a[$2]}:我們替換用戶中的第二個字段通過引用數組

  • 1 .txt文件:這是打印線

+1

天才!非常感謝你!這正是我所尋找的 – user3344199

+1

+1不錯的一個..。 。 – Kent

2

您可以使用sed改造city.txtsed腳本:

sed 's/\([^:]*\):\(.*\)/s%\2%\1%g/' city.txt 

再喂,爲了一個第二個sed實例處理users.txt

sed 's/\([^:]*\):\(.*\)/s%\2%\1%g/' city.txt | 
sed -f - users.txt 

並非所有sed變體都將接受標準輸入上的腳本文件;在這種情況下,你必須訴諸臨時文件。

+0

這種方法的+1,但可能有一個錯誤,不能識別一些ID,如'0212'和'02120' – BMW

+0

可以用字或字段邊界標記來詳細說明生成的腳本,但給定樣本數據(固定的領域長度與領先的零填充),這似乎並不必要。一個快速和骯髒的修復將是%:\ 2 $%:\ 1%' – tripleee