CSVファイル(各行)の最後のフィールドを新しい文字列に置き換える方法

CSVファイル(各行)の最後のフィールドを新しい文字列に置き換える方法

データベースからデータを抽出してcsvファイルにロードするスクリプトを作成しました。私はSunOS hstz1454 5.10システムを使用しています。

データは次のとおりです。

124,Y,Y,Y,Y,S
125,Y,Y,Y,Y,B
126,Y,N,N,N,B
140,Y,Y,N,N,F

最後のフィールドは、次のマッピングに従って置き換える必要があります。

B = BENIGN
C = CUSTOMER
F = FRAME
P = PPCOS
S = STANDARD
W = W-RED

CSVファイルの最後のフィールドをどのように置き換えて、次のように変換できますか?

124,Y,Y,Y,Y,STANDARD
125,Y,Y,Y,Y,BENING
126,Y,N,N,N,BENING
140,Y,Y,N,N,FRAME

答え1

そしてawk

awk -F'[, ]' 'FNR==NR{a[$1]=$NF;next};$NF=a[$NF]' OFS=, file2 file1

その中で、file1はキャラクターファイル、file2はデータファイルです。

答え2

sedを使用してください:

sed s'/S/STANDARD/g'
sed s'/C/Customer/g'
...
...

この簡単な解決策は、CSVフィールドに同じ値の他の大文字がない場合にのみ機能します。

最後の文字だけが必要な場合は、$を追加して行の末尾のみを表示できるようにします。

echo "124,Y,Y,Y,Y,S" | sed s'/S$/STANDARD/'

124,Y,Y,Y,Y,STANDARD

答え3

don_crisstiの解決策は非常に専門的ですが、それ以上の初心者向けの解決策が必要だと思います。なぜなら、またはjoin(キー指定)の内部の仕組みはsort初心者に説明したいものではないからです。

私は配列を使用しているので...拡張可能、将来の識別子を追加するかどうか。

使用法はですscriptname <file>

より安全なソリューション: (元のファイルは上書きされず、変換されたファイルはですoutput.csv。)

#!/bin/bash

arr_src=("B" "C" "F" "P" "S" "W")
arr_dst=("BENIGN" "CUSTOMER" "FRAME" "PPCOS" "STANDARD" "W-RED")

ftmp="$1"
fout="output.csv"
workfile=".wrkfil"
cp $ftmp $workfile # make backup!

for ((i=0;i<${#arr_src[@]};i+=1)); do
  sed -i 's/'"${arr_src[i]}"'$/'"${arr_dst[i]}"'/g' $workfile
  # echo && cat $workfile
done
mv $workfile $fout

より短いがより危険な解決策: (元のファイルを上書きするため、別の「文字」を追加する場合は、ソースとターゲットの配列の長さが常に同じであることを確認してください。そうしないと結果を予測できません。)

#!/bin/bash

arr_src=("B" "C" "F" "P" "S" "W")
arr_dst=("BENIGN" "CUSTOMER" "FRAME" "PPCOS" "STANDARD" "W-RED")

fout="$1"

for ((i=0;i<${#arr_src[@]};i+=1)); do
  sed -i 's/'"${arr_src[i]}"'$/'"${arr_dst[i]}"'/g' $fout
  # echo -e "\nOutput file now: $(cat $fout)"
done

関連情報