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
同じ構文がまったくありません。awk
do
do 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
形式の修正時間を取得します。