使用键搜索/替换:来自bash文件的值?

时间:2012-07-23 17:24:49

标签: bash

所以我有一个“键”文件,例如:

key1
key2
key3

我有一个密钥:值对的文件:

key1:value1
key2:value2
key3:value3

我想将密钥文件中的密钥替换为密钥:值文件中的相应值。因此,完成后,密钥文件将如下所示:

value1
value2
value3
...

在bash中执行此操作的最佳方法是什么?请注意,密钥在密钥文件中可能会出现多次,但只应在密钥:值文件中出现一次。

3 个答案:

答案 0 :(得分:3)

如果您的环境中有join命令,则以下内容应该有效。需要通过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':'

答案 1 :(得分: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";  
   }
 } 

答案 2 :(得分: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