Linuxは列6の数字を文字列に変換します。

Linuxは列6の数字を文字列に変換します。

データベースからデータを抽出してcsvファイルにロードするスクリプトを作成しました。私はSunOS hstz1454 5.10システムを使用しています。 csvファイルの数値を文字列に変換/変換する方法はありますか?したがって、6番目の列が数字の場合は1それを文字列に変換しCos426番目の列に数字がある場合はそれを別の文字列に変換します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,にカンマを配置することもできます。OFSprint

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-FFS

awk 'BEGIN { FS = OFS = "," }
     $6 == 1 { $6 = "Cos4" }
     $6 == 2 { $6 = "Cos6" }
     { print }' yourfile

C言語のように複合割り当てを使用できます。可能であれば、類似して関連することは、同様の方法で密接に一緒に行われるべきです。

おすすめ記事