テキスト出力の途中でawkから派生した合計を入力する方法[閉じる]

テキスト出力の途中でawkから派生した合計を入力する方法[閉じる]

行の途中で合計を印刷しようとしています。私のスクリプトはユーザー名の入力を求め、ファイルからそのユーザーのプロセスの総数と合計時間を抽出します。

文の途中に全数字を含む文を印刷したいと思います。

を使用すると、awkプロセスの総数と分を取得できますが、文の途中で方程式の結果を印刷することはできません。私の方程式の結果は文の後に表示されます。

HTMLのようにアンカーを使用する必要があると思います。パテを使用しています。

 oliver|Login|100
 smith|Login|20
 oliver|Time|25
 oliver|Time|25
 smith|Time|20
 Anne|Login|100

Example: User name? oliver
oliver has run 3 processes for a total of 150 minutes

 case $choice" in
   1) echo -n "User name?"
    read username
    echo "$username has run processes for a total of minutes"
    ;;

入力した特定のユーザー名のプロセスの総数と時間(分)を取得したいと思います。次に、その数が属する文に数字を挿入します。

ベストアンサー1

次のスクリプトは、プロンプトの代わりにコマンドラインから引数を取得します。これにより、他のスクリプトで再利用が容易になり、ユーザーが複数のユーザー名を指定できるようになります。

$ cat jake.sh 
#! /bin/sh

inputfile='input.txt'

for u in "$@" ; do
    awk -F'|' -v u="$u" '$1 == u { sum = sum + $3 ; count++} 
        END {print u " has run " count " processes for a total of " \
             sum " minutes."}' < "$inputfile"
done

シェルスクリプトが$uoptionsを介してシェル変数をawkスクリプトに渡す方法に注意してください-v u="$u"。これにより、シェルを直接使用するためにawkスクリプトの周りに二重引用符を使用する必要がなくなります。これは、awkスクリプトのすべてのインスタンスをバック$uスラッシュにエスケープする必要があるためです。$1$3"\

入力は例と同じです。

$ cat input.txt 
oliver|Login|100
smith|Login|20
oliver|Time|25
oliver|Time|25
smith|Time|20
Anne|Login|100

出力は次のとおりです。

$ ./jake.sh oliver smith Anne
oliver has run 3 processes for a total of 150 minutes.
smith has run 2 processes for a total of 40 minutes.
Anne has run 1 processes for a total of 100 minutes.

ユーザー名の入力を求める場合、スクリプトは次のようになります。

#! /bin/sh

inputfile='input.txt'

echo -n "User name?"
read username

awk -F'|' -v u="$username" '$1 == u { sum = sum + $3 ; count++} 
    END {print u " has run " count " processes for a total of " \
         sum " minutes."}' < "$inputfile"

おすすめ記事