2

プロセス置換を使用して while ループにフィードしようとしています。

logFile=$1
declare -A frequencyMap

while read line
do

 name=$(echo $line | awk '{print $11}')

 if [ ${frequencyMap[$name]+_} ]

   then frequencyMap[$name]=$(expr ${frequencyMap[$name]} + 1)

   else frequencyMap[$name]=1

 fi

done < <(zgrep 'PersonalDetails' $logFile)

for key in "${!frequencyMap[@]}"
do 
 echo "$key ${frequencyMap[$key]}"
done | sort -rn -k2

これは bash では正常に機能しますが、zsh では機能しません。次のエラーが表示されます。

test.sh: line 20: syntax error near unexpected token `<'
test.sh: line 20: `done < <(zgrep 'Exception' $1)'

zsh 4.3.10 を使用しています。

これをzshで動作させるにはどうすればよいですか?

更新:完全なコードを共有するために質問を変更しました

4

1 に答える 1

4

代わりに、より一般的なパイプを使用できます。

zgrep 'PersonalDetails' "$logFile" |
{
  while read line
  do
    # ...
  done

  for key in "${(k)frequencyMap[@]}"
  do 
    echo "$key ${frequencyMap[$key]}"
  done | sort -rn -k2
}

これは移植性が高いだけでなく、入力ファイルを開くことからフローが始まるため、読みやすいと思います。

コマンドを構成するために中括弧を使用する必要があるという事実を指摘してくれた @ user000001 に感謝しfrequencyMapますwhile。それが必要な理由については、こちらを参照してください: http://mywiki.wooledge.org/BashFAQ/024

于 2015-09-27T07:29:50.217 に答える