UnixでExcelのvlookup機能に似た機能を作成するにはどうすればよいですか?
オフィスホームページから抜粋、ルックアップテーブル
VLOOKUPのVは垂直を意味します。比較値が探しているデータの左側の列にある場合は、HLOOKUPの代わりにVLOOKUPを使用してください。
構文 VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
Lookup_valueテーブル配列の最初の列から取得する値。 Lookup_valueは値または参照です。 lookup_valueがtable_arrayの最初の列の最小値より小さい場合、VLOOKUPは#N / Aエラー値を返します。
Table_array 2 つ以上のデータ列です。範囲または範囲名への参照を使用します。 table_arrayの最初の列の値は、lookup_valueで取得した値です。これらの値は、テキスト、数値、または論理値です。大文字と小文字のテキストは同じです。
Col_index_num一致する値を返す必要があるtable_arrayの列番号。 col_index_num が 1 の場合は table_array の最初の列の値が返され、 col_index_num が 2 の場合は table_array の 2 番目の列の値が返される式です。 col_index_numが次の場合:
1より小さい場合、VLOOKUPは#VALUEを返します!違い。 table_arrayの列数より大きい場合、VLOOKUPは#REFを返します!違い。
Range_lookup VLOOKUP が正確な一致またはおおよその一致を見つけるかどうかを指定する論理値です。
ファイル1:
1GR_P1:001PI
:040VG_L1
:001PO_L3
1JPI_P1:001PO_L1
1JPI_P1:001PO_L2
ファイル2:
1JPI_P1:001PO_L1 1401UC
1JPI_P1:001PO_L2 1401UC
1HIK_P2:001ER 1402UC
1GR_P1:001PI 1402UC
出力ファイル3:
1GR_P1:001PI 1402UC
:040VG_L1 NA
:001PO_L3 NA
1JPI_P1:001PO_L1 1401UC
1JPI_P1:001PO_L2 1401UC
ベストアンサー1
vlookup
Unixの汎用関数などの操作を実行できる汎用関数はありません。代わりに、よりカスタマイズされたアプローチで問題に対するソリューションを構築するための「ブリック」を提供します。これらの「レンガ」はgrep
、、awk
などsed
のツールです。
これらのツールのいずれかをawk
次のように使用できます。
vlookup.awk
FNR==NR{
a[$1]=$2
next
}
{ if ($1 in a) {print $1, a[$1]} else {print $1, "NA"} }
はい
$ awk -f vlookup.awk file2 file1
1GR_P1:001PI 1GR_P1:001PI
:040VG_L1 NA
:001PO_L3 NA
1JPI_P1:001PO_L1 1JPI_P1:001PO_L1
1JPI_P1:001PO_L2 1JPI_P1:001PO_L2
次のcolumn
コマンドを使用して出力をクリーンアップできます。
$ awk -f vlookup.awk file2 file1 | column -t
1GR_P1:001PI 1GR_P1:001PI
:040VG_L1 NA
:001PO_L3 NA
1JPI_P1:001PO_L1 1JPI_P1:001PO_L1
1JPI_P1:001PO_L2 1JPI_P1:001PO_L2
詳細
上記のawk
スクリプトは値をキーとして使用して、インデックス付き配列にfile2のすべての内容を入れます。
a[$1]=$1
file2
配列を読んa
だ後、一度file1
に1行ずつ調べて決定を下します。file1
列 1 の値が配列にある場合、a
列 2 の対応する値はfile2
列 1 と一緒に印刷されます。file1
存在しない場合は、「NA」メッセージが印刷されます。