awkコマンドのENDブロックでFORループを使用する

awkコマンドのENDブロックでFORループを使用する

1日の平均ファイル数を取得しようとしています。

次のスクリプトが機能します。

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
               printf "%s\t%d\n", date, freq[date]
}'

次のようにforループにdoとdoneを追加すると、

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
do
               printf "%s\t%d\n", date, freq[date]
done
}'

次のエラーが発生します。

awk: cmd. line:8: done
awk: cmd. line:8: ^ syntax error

awkコマンドのENDブロック内に複数行のforループステートメントを作成するには?

解決策:

awkコマンドのENDブロックでforループを開始および終了するには、{と}を使用する必要があります。

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
{
        count=count+1
        total=total+freq[date];
        printf "%s\t%d\n", date, freq[date]
}
printf "Average files per day : %d\n",(total/count)
}'

答え1

done同じ構文がまったくありません。awkdodo statement while (condition)

中かっこを使用する必要があります。

for (date in freq) { cmd1; cmd2; cmd3; }

答え2

一般に、ls出力の解析に問題があることを考慮してください。

バラよりlsの出力を解析しない理由(プラスリンクページ)。

ファイルの日付/時刻を操作するためのソリューションとしてGNU(利用可能な場合)を使用し、getfindなどのGNU拡張を使用できます。-printf "%T@"UNIX 時代または、簡単に分析できる形式で時間を出力します。 (確認man findするここを読んでください )。

--編集: Kevinは次のように指摘しました。

BSD find(および他の実装)にはこの機能はありません。ただし、stat同じ情報を得るために(存在する場合)使用できます。人々を確認してください。

--編集終了

たとえば、次のようにできます。

find . -maxdepth 1 -type f -printf "%TY%Tm%Td-%TH%TM%TS" 

YYYYMMDD-HHMMSS形式の修正時間を取得します。

関連情報