ファイルから2つの変数を抽出するシェルスクリプトを作成しており、以下のFORループを使用しました。
for i j in `cat list`
do
echo title
echo total "$i" "," "$j"
echo end
done
猫のリストどこか
AAA 111
BBB 222
CCC 333
予期しない「j」エラーが発生しました。 「whileループ」を使用しましたが、運がありませんでした。
予想される出力は次のとおりです。
title
total AAA,111
total BBB,222
total CCC,333
end
ベストアンサー1
for
実際にもループも必要ありません。while
次のいずれかのコマンドがawk
機能します。
awk 'BEGIN {print "title"}
{print "total",$1","$2}
END {print "end"}' list
または:
awk 'BEGIN {print "title"}
{printf "total %s,%s\n", $1, $2}
END {print "end"}' list
ファイルのデータを読み取る前に、BEGIN{print "title"}
単語を一度印刷します。title
{print "total",$1","$2}
total
列の値の間のスペースを表す引用符のないカンマの後に単語を印刷し、列自体を印刷します。このブロックは各入力行に対して実行されます。
END{print "end"}
end
ファイルの単語と終わりを印刷します。 END はファイルから最終入力を読み取った後、ブロックを実行するよう指示します。
2番目のコマンドの場合:
唯一の違いは次のとおりです。
{printf "total %s,%s\n", $1, $2}
これは、型が定義されている場所のprintf
代わりにprint
最初のパラメータを使用します。
%s,%s
との値をカンマで区切って印刷し、次の行に移動する$1
には、新しい行を表し、ファイルの最後までとの値を印刷するように指示します。$2
\n
$1
$2
個人的には、引用符とコンマのprintf
両方を使用するのではなく、単一の引用符セットのみを使用できるため、2番目のコマンドを使用します。total
また、マニュアルページを読んでみるとわかるように、さらにモジュール化されています。 2つの異なる方法を示すために、2つのコマンドのみを含めました。
出力
title
total AAA,111
total BBB,222
total CCC,333
end