我创建了一个脚本,用于从数据库中提取数据并将其加载到 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
或 (keyed)的内部工作原理都不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