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

관련 정보