
スケジューラが呼び出すために、1行のコマンドをスクリプトに変換しようとしています。しかし、bashで実行するとコマンドは正常に機能しますが、シェルスクリプトで実行するとボットは機能しません。
$FILE1 ファイルに次のデータがあります。
1,Date,Country,Europe,6
2,Date,Country,America,22
3,Date,Country,America,22
4,Date,Country,Asia,9
5,Date,Country,Australia,29
予想される出力は、国名と20より大きい数値、および一意の値のみを入力することです。たとえば、次のようになります。
America, 22 MILLION
Australia, 29 MILLION
私のコードは次のとおりです。一意の値を提供する代わりに、すべての重複値を提供します。
#This will only pull Country column i.e. America, Australia and so on...
grep "Country" FILE1|cut -f4 "," > $FILE2
#This will use the keyword America from FILE2 and search in FILE1 for associated count and copy in FILE3
for i in $(cat $FILE2);
do
cat $FILE1|grep "Country"|grep $i|echo $i, `wc -l` MILLION >> $FILE3;
done;
#Now that we have both country name and count...we will find countries only with >20 count
for a in $(cat $FILE3);
do
awk -F "," '$2 > 20' $FILE3 |sort -u > $FILE4
done;
#Send the final file to email
echo "Here is the data"|mailx -s "Population data" -a FILE4 user@email
2番目の質問は、どうすれば良い方法でフォーマットできますか?たとえば、
America has more than 22 million population
Australia has more than 29 million population
変える
America, 22 million
Australia, 29 million
ありがとうございます。基本的な質問ならすみません。私はちょうどUnixスクリプトの作業を始めました。
答え1
フルテキスト処理タスクを単一のawk
プログラムにまとめることができます。
awk -F',' '($5>20)&&(!seen[$4]++){printf "%s has more than %d million inhabitants\n",$4,$5}' data.csv
これはファイルをCSVファイルに解析し、5番目のフィールドを調べて20より大きいことを確認し、内部発生カウンタを維持してseen
国名がまだ見つかっていないことを確認します。両方の条件が満たされている場合にのみ、フィールド4と5の情報を組み合わせて必要な文字列を印刷します。
これをシェルスクリプトに含めるには:
awk -F',' '($5>20)&&(!seen[$4]++){printf "%s has more than %d million inhabitants\n",$4,$5}' "$file1" > "$file4"
参考までに良い習慣です。いいえ環境変数としてエクスポートする場合を除き、シェル変数名はすべて大文字で使用し、不要なトークン化を防ぐためにシェル変数を正しく引用してください。
私はそれを調べてみることを提案します。GreyCat&Lhunathのバッシュガイドシェルスクリプトに関する追加情報。また、インストールを検討してください。住宅検査これは、シェルスクリプトで多くの構文エラーをキャッチするのに役立ちます。