
私のファイルにはThreadout.txt
次の内容が含まれています。Thread 1/1/25/100
val1=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $1}')
val2=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $2}')
val3=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $3}')
val4=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $4}')
for((i=1;i<5;i++))
do
val[i]=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $[i]}')
echo $val[i]
done
この配列を試しましたが、1 1 25 100
値などの正しい結果を提供しません。エラーがありますか?
答え1
コードにはいくつかの問題があります。
- 覚えておくべき最初の重要な点は、
awk
プログラムが一重引用符で囲まれているため(推奨)、シェルパラメータ拡張が発生せず、ステートメントがprint $[i]
機能しないことです。これを見てStackOverflowの詳細Q&Aawk
プログラムでシェルパラメータを使用する方法について説明します。 - ただし、()変数
awk
に番号が格納されているフィールドではなく、アドレスが割り当てられます。awk
n
$n
$[n]
val1
変数を割り当てますval4
が、実際には使用しないため、スクリプト例の最初の部分では何もしません。${val[i]}
最後に、配列変数を逆参照するには、notを宣言する必要があります$val[i]
(これにより、変数の内容$val
(空の文字列)と固定文字列が印刷されます[i]
)。
awk
繰り返し呼び出して(私が知っている限り)、フィールド区切り文字としてのみ使用したThread
場合、入力例の主な問題を解決できないなど、いくつかの非効率性があります。/
これらの問題を解決するには、例の関連値にスペースが含まれていないため、次のことを試してください。
#!/bin/bash
val=( $(awk '/^Thread/{n=split($2,a,/\//); for (i=1;i<=n;i++) printf("%s%s",a[i],OFS)}' Threadout.txt) )
for i in ${!val[@]}
do
echo "${val[i]}"
done
- この呼び出しは、配列内の部分である行の
awk
2番目の「フィールド」を分割し、配列内のすべての項目を(デフォルトは空白)で区切って印刷します。Thread 1/1/25/100
1/1/25/100
/
a
OFS
- シェルスクリプトはスペースで区切られたトークンのリストなので、
awk
ステートメントを介して各トークンを配列変数に割り当ててこのプログラムの出力を取得します。val
val=( ... )
- 次に配列インデックスを繰り返し、配列値を印刷します。
より多くのbash配列を読みたいかもしれません。GNU BashリファレンスマニュアルまたはGreyCat&Lhunathのバッシュガイド。ぜひご覧ください。住宅検査シェルスクリプトをデバッグします。