データベースからデータを抽出して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