シェルスクリプトのコマンドラインが機能しません。

シェルスクリプトのコマンドラインが機能しません。

スケジューラが呼び出すために、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のバッシュガイドシェルスクリプトに関する追加情報。また、インストールを検討してください。住宅検査これは、シェルスクリプトで多くの構文エラーをキャッチするのに役立ちます。

おすすめ記事