
#!/bin/ksh
Temp=Kerala
cs1=`grep "$Temp" State_list.txt | awk '{print $NF}'`
echo $cs1 #("Not seeing output KL":
次のようにコードを変更すると機能します。
cs1=`grep "Kerala" State_list.txt | awk '{print $NF}'`
...しかし、変数として渡したいです。
State_List.txt ファイルは次のとおりです。
Karnataka KAR
TamilNadu TN
Kerala KL
答え1
この問題はコメントセクションで解決されました。
要約:
これらのファイル(スクリプトファイルとデータファイルを含む)はDOSテキストファイルです。 Unixでは、\r
各行の末尾に追加(キャリッジリターン)文字があることを意味します。
スクリプトの場合、これは変数の割り当てを意味します。
Temp=Kerala
Kerala\r
変数に値を割り当てますTemp
。データファイルには値が含まれていないため、見つかりません。
変数の代わりに挿入された値を使用してスクリプトを実行すると、データの適切な場所にあるDOSテキストの問題の影響を受けないため、機能します。
両方のファイルにユーティリティをインストールして実行し、それがdos2unix
Unixテキストファイルであることを確認する必要があります。また、見ることができますこのサイトに関するその他の質問このユーティリティに関連しています。
スクリプトは次のように書くこともできます。
#!/bin/sh
Temp='Kerala'
cs1=$( awk -v pattern="$Temp" '$1 ~ pattern { print $NF }' State_list.txt )
printf '%s\n' "$cs1"
これは削除され、grep
その場でawk
データ内のファイルの最初の列pattern
(コマンドラインに割り当てられた変数)を含むすべての行を取得するために使用されます。正規表現のマッチングではなく正確な文字列マッチングを実行するには、その場で$Temp
使用してください。==
~
このスクリプトはsh
(そして元のスクリプトも)特別なksh
機能を使用しないので、スクリプトです。