1

だから私は「キー」のファイルを持っています、例えば:

key1
key2
key3

キーと値のペアのファイルがあります。

key1:value1
key2:value2
key3:value3

キーのファイル内のキーを、key:valueファイル内の対応する値に置き換えたい。したがって、キーのファイルは、完了すると次のようになります。

value1
value2
value3
...

これをbashで行う最良の方法は何ですか?キーはkeysファイルに複数回表示される場合がありますが、key:valuesファイルには1回だけ表示される必要があることに注意してください。

4

3 に答える 3

3

ご使用の環境でjoinコマンドを使用できる場合は、以下が機能するはずです。(シュワルツ変換を介して)元のキーの順序を復元するには、awkコマンドを介してインデックスを追加する必要があります。

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」が必要なことはわかっていますが、これは簡単な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";  
   }
 } 
于 2012-07-23T17:34:05.433 に答える
0

私は純粋なbashソリューションのためのものを持っているので、このソリューションを投稿します。連想配列を使用しているため、bash4以降でのみ機能します。

#!/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 に答える