데이터베이스에서 데이터를 추출하여 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