所以我有一个“钥匙”文件,例如:
key1
key2
key3
我有一个键:值对文件:
key1:value1
key2:value2
key3:value3
我想用 key:value 文件中的相应值替换我的键文件中的键。因此,完成后的密钥文件将如下所示:
value1
value2
value3
...
在 bash 中执行此操作的最佳方法是什么?请注意,一个键可能在密钥文件中出现多次,但在 key:values 文件中应该只出现一次。
所以我有一个“钥匙”文件,例如:
key1
key2
key3
我有一个键:值对文件:
key1:value1
key2:value2
key3:value3
我想用 key:value 文件中的相应值替换我的键文件中的键。因此,完成后的密钥文件将如下所示:
value1
value2
value3
...
在 bash 中执行此操作的最佳方法是什么?请注意,一个键可能在密钥文件中出现多次,但在 key:values 文件中应该只出现一次。
如果 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':'
由于我对纯 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
我知道你想要 "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";
}
}