所以我有一个“键”文件,例如:
key1
key2
key3
我有一个密钥:值对的文件:
key1:value1
key2:value2
key3:value3
我想将密钥文件中的密钥替换为密钥:值文件中的相应值。因此,完成后,密钥文件将如下所示:
value1
value2
value3
...
在bash中执行此操作的最佳方法是什么?请注意,密钥在密钥文件中可能会出现多次,但只应在密钥:值文件中出现一次。
答案 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.txt
和keys.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