データベースからデータを抽出してcsvファイルにロードするスクリプトを作成しました。私はSunOS hstz1454 5.10システムを使用しています。 csvファイルの数値を文字列に変換/変換する方法はありますか?したがって、6番目の列が数字の場合は1
それを文字列に変換しCos4
、2
6番目の列に数字がある場合はそれを別の文字列に変換しますCos6
。最後の文字を文字列に変換する前にスクリプトを使用しました。おそらく私がやりたいことに似ていると思います。
for fname in conv2015_10_TrafficProfile_data_migration.csv
do
echo "Translate each char to a string $fname"
sed s'/S$/STANDARD/g; s/C$/CUSTOMER/g; $fname > tmp.tmp
mv tmp.tmp $fname
done
私のデータは次のとおりです。
4,2,64,1088,80,1,Y,Y
5,2,64,1088,95,2,Y,Y
6,2,1088,39813120,0,2,Y,Y
7,2,1088,39813120,5,1,Y,Y
8,2,1088,39813120,10,2,Y,Y
ベストアンサー1
あなたは奇妙なことをしたいです。私の考えでは、単純な交換にsed -e 's/this/that'
加えて、awkの代わりにsedを使用する理由はほとんどありません(awkよりもはるかに複雑ではありません)。この場合、特に非生産的です。
を使用して、awkに区切り文字として使用するように指示できます。場所フィールドを再グループ化するコマンドがコンマと結合するように、awkの変数(出力フィールド区切り文字)-F,
にカンマを配置することもできます。OFS
print
awk -F, 'BEGIN { OFS="," } ...'
さて、論理を固めましょう。 Awkは位置フィールド変数$1
、、...への$2
割り当てを可能にするので、一種の「レスポンシブプログラミング」をサポートしています。これらの変数に値を割り当てると、$0
元の入力行を保持していた変数が自動的に再構成されます。位置フィールドとOFS
その間の位置フィールドを組み合わせて再構成します。だから私たちはこれを行うことができます:
awk -F, 'BEGIN { OFS="," }
{ if ($6 == 1) $6 = "Cos4"
else if ($6 == 2) $6 = "Cos6"
print }' yourfile
再コンパイルする必要はありません。 6ヵ月後に再び訪れると、すぐに何をしているのか理解できます。
上記のコードは、条件付きテストを別々のawkルールに分割することで少し単純化できます。言い換えれば:
awk -F, 'BEGIN { OFS="," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
{ print }' yourfile
{ print }
また、次のように置き換えて「ゴルフコーディング」を実行できます1
。
awk -F, 'BEGIN { OFS="," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
1' yourfile
この定数は1
ブール真理条件で動作します。この条件にはジョブがないため、Awkはデフォルトのジョブインを提供します{ print }
。しかし、6ヶ月後に再び訪問する場合は、この点を覚えておく必要があります。このように計画を短く削減すると、時には将来の借金が発生する可能性があります。
一方、ブロックOFS
に設定することなので、対応するオプションを避け、同じブロックに設定するのが良い変換です。BEGIN
-F
FS
awk 'BEGIN { FS = OFS = "," }
$6 == 1 { $6 = "Cos4" }
$6 == 2 { $6 = "Cos6" }
{ print }' yourfile
C言語のように複合割り当てを使用できます。可能であれば、類似して関連することは、同様の方法で密接に一緒に行われるべきです。