Unix 플랫 파일(awk, sed)에서 선택한 큰따옴표 필드에서 선행 0을 제거합니다.

Unix 플랫 파일(awk, sed)에서 선택한 큰따옴표 필드에서 선행 0을 제거합니다.

단일 헤더와 많은 레코드가 포함된 플랫 파일(txt/csv)이 있습니다. awk/sed/unix 도구를 사용하여 레코드의 필드 3과 5에서만 선행 0(하나 이상의 선행 0일 수 있음)을 제거하고 싶습니다. 여러 솔루션을 살펴봤지만 대부분은 큰따옴표 값을 고려하지 않는 것 같습니다. 예:

"ACCOUNT","REAL","022000046977525","REAL","00000220000488","ONLINE",......

awk, sed, printf, 정규식 등을 시도해 보았습니다. 이미 게시된 내용을 제가 놓친 걸까요? 아이디어? 감사해요.

원하는 출력:

"ACCOUNT","REAL","22000046977525","REAL","220000488","ONLINE",......

답변1

사용 awk:

awk -F, '{OFS=","; sub(/"0+/, "\"", $3); sub(/"0+/, "\"", $5)}1'

헤더에 실제로 앞에 0이 없는 한 문제가 되지 않지만 필요한 경우 다음을 수행할 수 있습니다.

awk -F, 'NR > 1{OFS=","; sub(/^"0+/, "\"", $3); sub(/^"0+/, "\"", $5)}1'

이렇게 하면 "필드 3과 5의 모든 선행 0이 따옴표로만 대체됩니다.

답변2

사용밀러, 헤더가 포함된 CSV 파일 제공

$ cat file.csv
"000001","000002","000003","000004","000005","000006","000007"
"ACCOUNT","REAL","022000046977525","REAL","00000220000488","ONLINE",......

(헤더의 앞에 오는 0이 영향을 받지 않는다는 것을 증명하기 위해 어리석은 필드 이름을 선택했습니다.) 그런 다음

$ mlr --csv --ofmt '%.0f' --quote-all put '$000003=$000003; $000005=$000005' file.csv
"000001","000002","000003","000004","000005","000006","000007"
"ACCOUNT","REAL","22000046977525","REAL","220000488","ONLINE","......"

또는 csvformat(python csvkit에서) 및 numfmt(GNU Coreutils에서) 다음을 사용하세요.

$ csvformat file.csv | numfmt -d, --header --field 3,5 --format '%.0f' | csvformat -U2
"000001","000002","000003","000004","000005","000006","000007"
"ACCOUNT","REAL","22000046977525","REAL","220000488","ONLINE","......"

답변3

GNU sed 사용:

$ sed -re '
   s/","/\n/4;s//\n/2
   s/\n0*([0-9])/","\1/g
' file.csv

모든 필드가 참조된다고 가정합니다.

세 번째와 다섯 번째 필드를 줄 바꿈으로 표시하고 선행 0을 모두 제거합니다. 모두 0이면 필드가 사라지는 대신 끝에 그대로 유지됩니다.

관련 정보