コマンドの出力を配列に代入したかったのですが、次の問題に遭遇しました。
temp=`<some_command>`
eval set -A array $temp
print $temp
print "***${array[0]},${array[1]}***"
コマンドの出力は次のようになります。
""
"D"
"M"
"N"
私の予想では、 で${array[0]}
ある必要があり""
、${array[1]}
「D」である必要があります。
しかし、結果は次のとおりです。
" "D" "M" "N" # $temp
*** D M N,*** # ${array[0]},${array[1]}
配列の最初の要素がすべての出力をスイープする方法がわかりません。そして、それを修正する方法は?
更新: 今日、スクリプトをもう一度調べたところ、コマンドの出力は次のようになっていることがわかりました。
" "
"D"
"M"
"N"
最初の行は" "
、純粋な空の文字列ではなく (スペース文字が含まれています) であることに注意してください""
。
まず、元の出力は次のとおりです。
<some_command> |sort |uniq -c
6421 " "
1090 "D"
1 "DPV_VALID"
3 "M"
588 "N"
16 "S"
6382 "Y"
最初の行は純粋な空の文字列だといつも思っていました。たとえば""
、二重引用符にスペース文字があることに気づきませんでした。
次に、awk
2番目のフィールドを取得していました:
<some_command> |sort |uniq -c |awk '{print $2}'
出力は次のようになりました。
"
"D"
"M"
"N"
これが後でコマンドを台無しにする原因ですeval set -A
(awk
デフォルトではスペース文字を区切り文字として使用します)。それが純粋な空の文字列であれば、うまくいきました。
コマンドを次のように書き直しても機能します。
temp=`<some_command> |sort |uniq -c |sed 's/" "$/""/' |awk '{print $2}'`
eval set -A array $temp
それでも、グレンのソリューションもかなりきれいです。ありがとう!