如何用新字符串替换 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或 (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

相关内容