1

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

key1
key2
key3

我有一个键:值对文件:

key1:value1
key2:value2
key3:value3

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

value1
value2
value3
...

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

4

3 回答 3

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':'
于 2012-07-23T17:40:09.237 回答
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
于 2012-07-23T17:51:00.987 回答
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";  
   }
 } 
于 2012-07-23T17:34:05.433 回答