複数のキーで入力されたファイルから値を抽出する

複数のキーで入力されたファイルから値を抽出する

ペアを含むファイルを考えてみましょうkey=value。それぞれはkey複数の s の接続であってもよい。keyつまり、複数のkeyものを1つにマッピングできますvalue。その理由は、key各単語が長さと比較して比較的短い単語であるため、valueデータがより少ない数の行に「圧縮」されるからである。

例(つまり、実際の値ではありません):

$ cat testfile
AA,BB,CC=a-lengthy-value
A,B,C=a-very-long-value
D,E,F=another-very-long-value
K1,K2,K3=many-many-more
Z=more-long-value

すべてのkeysが一意で、次の文字を含まないと仮定すると有効です。

  • key分離記号:,
  • キー値区切り記号:=
  • スペース文字:

keysはどんな形でも現れます。未来(上記の制約により)また、次の正規表現にも従います[[:upper:]]{2}[[:upper:]0-9]。同様にvalue、sは含まれていないので、=各行=を分割するために安全に使用できます。複数行も行keyもないvalueため、1行ずつ処理するのも安全です。

このファイルからデータを簡単に抽出するために、次getval()の関数が定義されています。

getval() {
    sed -n "/^\([^,]*,\)*$1\(,[^=]*\)*=\(.*\)$/{s//\3/p;q}" testfile
}

したがって、呼び出しは代わりにgetval A値を返します。また、存在しない項目については何も返さないでください。a-very-long-valuea-lengthy-valuekey

質問:

  • 堅牢性の現在の定義でgetval()十分ですか?
  • より短く、より表現的で、より制限的な他のデータ抽出方法はありますか?

とにかく、このスクリプトはcygwinで実行され、付属してbashcoreutilsます。したがって、ここでは移植性は必要ありません(つまり、ボーナスポイントのみが提供されます)。ありがとうございます!

編集する:

機能が修正され、キーの説明が追加されました。

編集2:

書式(複数行なし)と移植性(要件ではない)に関する注意事項を追加しました。

ベストアンサー1

以下を使用して、より読みやすい形式で作成できますawk

getval() {
    awk -F'=' '$1~/\<'"$1"'\>/{print $2}' testfile
}

おすすめ記事