2012-07-23 54 views
1

所以我有「鑰匙」的文件,例如:使用鍵搜索/替換:bash中的文件中的值?

key1 
key2 
key3 

和我有密鑰的文件:值對:

key1:value1 
key2:value2 
key3:value3 

我想取代我的文件中的密鑰鍵和它們在鍵值文件中的對應值。因此,密鑰文件將看起來像這樣完成後:

value1 
value2 
value3 
... 

什麼是在bash中做到這一點的最佳方法?請注意,密鑰可能會在密鑰文件中出現多次,但應該只在鍵值文件中出現一次。

回答

3

如果連接命令在環境中是可用的,下面應該工作。需要通過awk命令添加索引以恢復原始鍵順序(通過Schwartzian變換)。

join -o 1.1,2.2 -t':' -1 2 -2 1 <(awk '{print(NR":"$0)}' key_file | sort -k2,2 -t':') <(sort -k1,1 -t':' key_values_file) | sort -k1,1 -t':' | cut -f2 -d':' 
+0

不確定這是否按我指定的方式工作。我的密鑰文件有67,683個條目。由此產生的文件有37,098個條目。我提到一個密鑰可能會在密鑰文件中出現多次(並且我希望相應的值在輸出中正好顯示該次數)。 – Rsaesha 2012-07-23 18:14:02

+0

我的不好。我有一些文件困惑。 :D謝謝,你的回答很好! – Rsaesha 2012-07-23 18:20:25

0

我知道你想要「bash」,但這很簡單,用一個快速的perl腳本解決。假設你有文件pairs.txtkeys.txt

use strict; 
my %keys2values; 

# read through the pairs file to get the key:value mapping 
open PAIRS, "cat pairs.txt |" ; 
while(<PAIRS>) { 
    chomp $_; 
    my ($key,$value) = split(":",$_); 
    $keys2values{$key} = $value; 
} 

open KEYS, "cat keys.txt |"; 
while(<KEYS>) { 
    chomp $_; 
    my $key = $_; 
    if(defined $keys2values{$key}) { 
     print "$keys2values{$key}\n"; 
    } 
    # if a key:value pair isn't defined, just print the key 
    else { 
     print "$key\n"; 
    } 
} 
0

由於我有一個純粹的bash解決方案,我只是發佈這個解決方案。它只能在bash 4+中工作,因爲它使用關聯數組。

#!/bin/bash 

while IFS=: read key value; do 
    declare -A hash[$key]=$value 
done < pairfile 

while read key; do 
    printf '%s\n' "${hash[$key]}" 
done < keyfile 
+1

我冒昧地在第一個循環中修復了一些錯誤,因爲我正準備發佈相同的解決方案。 – chepner 2012-07-23 17:54:03