2016-02-24 127 views
0

我有兩個文件input1.txt和input2.txt。匹配文件中的字符串並打印下一列

input1.txt具有以下細節:

abcd.net 
bcad.net 
cagh.net 
degh.net 
usna.net 

input2.txt具有以下細節:

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
us-1212-qwe.net 169.254.232.50 
us-cisco.net 10.120.2.3 
degh.net 169.254.0.5 
usna.net 169.254.0.6 
ab1234.net 169.254.0.7 
catorr.net 169.254.0.8 

我需要在 「input1.txt」 中列出的服務器對應的IP細節從文件 「input2.txt」

輸出應該是這樣的:

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
degh.net 169.254.0.5 
usna.net 169.254.0.6 

我的代碼如下所示無法正常工作。請幫忙。

for i in `cat input1.txt`; do more input2.txt | grep -w "^$i"; done 
+0

每當你在shell中編寫一個循環來操縱文本時,你有錯誤的方法。請參閱http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice。 –

回答

2
awk 'FNR==NR{ip[$1]=$2} FNR!= NR {print $1, ip[$1]}' input2.txt input1.txt 

這通過讀取input2.txt並建立所期望的數據的陣列,由第一列索引。然後它讀取intput1.txt併爲每行打印主機加上數組中的數據。

請注意,上面給出的答案不再適用,因爲問題已被編輯。對於編輯的問題,你可以這樣做:

awk 'FNR==NR{ip[$1".net"]=$2} FNR!= NR {print $1, ip[$1]}' input2.txt input1.txt 

但這不是最好的通用解決方案。 (例如,硬編碼文本 「.NET」 是一個可怕的做法,但對於一個快速的黑客,這是好的。)

+0

你能解釋它是如何工作的嗎? – user3834663

+2

或者無效複製,然後否定條件:'FNR == NR {ip [$ 1] = $ 2; next} {print $ 1,ip [$ 1]}'。 @ user3834663這是絕對基本的awk - 閱讀Arnold Robbins編寫的Effective Awk Programming第4版的前幾章,瞭解該腳本,然後在嘗試更多的shell編程之前完成閱讀。 –

+0

以類似的方式,如果input1.txt只有下面的短名稱。我應該如何匹配? abcd bcad cagh degh usna – user3834663

1

替代awk

join <(sort input1) <(sort input2) 

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
degh.net 169.254.0.5 
usna.net 169.254.0.6 

或好老的grep

grep -f input1 input2 

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
degh.net 169.254.0.5 
usna.net 169.254.0.6 
相關問題