2017-09-08 6 views
-1

コマンドは、awkの変数を使用してawkコマンドの外

awk -F'\t' '{map[$1]=$4}' analytics-details-bkp-ga.txt 

は...例えば キー1 = VALUE1 キー2 =値2、キー値のマップを生成し、その

に私はこれを使用してループの持っていますマップはの値を取得するには、特定のキー

私は上記のforループの中にマップを使用する必要が
for i in `cat stores.txt` 
do 
    ..... 
done 

、どのようにawkのcommand.Can内側のforループを書きたくないit.Iを使用するので、 awkコマンドの外側でawkコマンドで生成されたマップを使用する方法についての私の助け?あなたがサンプル入力と出力を投稿することができた場合は

+1

地図で何をしたいですか?あなたはawkでそれをすることはできませんか? awkハッシュテーブルをシェル変数 – Kent

+0

にエクスポートするのは容易ではありませんforループ処理は、1つのファイルを生成し、マップから対応するキー値を使用してファイルに名前を付ける必要があります。 –

+2

問題の要件を追加します。それはawkで行うことができます。 – Kent

答えて

0

連想配列を作成することができます(例:。 mapここ)は、次のようになります。

declare -A map 
for i in $(awk -F'\t' '{map[$1]=$2} END{ for(key in map) {print key":"map[key] }}' file) 
do 
    key=${i%:*} 
    value=${i#*:} 
    map[$key]=$value 
done 
+0

i%:*とi#*はどういう意味ですか? –

+0

awkは、出力をkey1:value1 key2:value2 ....と返します。キーの各ペアについて、値 'i'は、' $ {i%:*} 'は' i'の部分文字列の最短一致を'$ {i#*:} 'という式を': 'に渡すと、文字列' i'の先頭から ':'まで部分文字列の最短一致を削除して値を返します。 – batMan

+1

また、次回からは問題のすべての要件を正しく記述し、達成したいことを明確に表現して、@Ed-morton氏のようにXY問題として表示されないようにしてください。 – batMan

2

あなたはbash >= 4を持っている場合は、あなたが連想配列を利用することができ、

、シンプルawkはあなたの 問題を解決することがあります。あなたは、私が上記のforループの中にマップを使用する必要が

言ったので

、どのようにit.Iは、awkコマンドの内部ループの 書き込みしたくない使用します。私はbashの連想配列を使用することをお勧め

サンプル入力

[[email protected] tmp]$ cat testfile 
foo bar 
jack john 
me you 
now then 
so me 

スクリプト

[[email protected] tmp]$ cat test.sh 
#!/usr/bin/env bash 

declare -A assoc 

while read -r col1 col2; do 
    assoc["$col1"]=$col2; 
done < testfile 


for key in "${!assoc[@]}"; do 
    echo "${key} ---> ${assoc[${key}]}" 
done 

出力

[[email protected] tmp]$ bash test.sh 
jack ---> john 
so ---> me 
now ---> then 
foo ---> bar 
me ---> you 
+3

BASH変数が必要な場合はBASH変数が必要な場合はBASHを使用し、そうでない場合は 'awk'自体のすべてを' bash'よりも可能にしてください。 – anubhava

+1

奨励してくれてありがとうございます。 –

関連する問題