![Unix 플랫 파일(awk, sed)에서 선택한 큰따옴표 필드에서 선행 0을 제거합니다.](https://linux55.com/image/165531/Unix%20%ED%94%8C%EB%9E%AB%20%ED%8C%8C%EC%9D%BC(awk%2C%20sed)%EC%97%90%EC%84%9C%20%EC%84%A0%ED%83%9D%ED%95%9C%20%ED%81%B0%EB%94%B0%EC%98%B4%ED%91%9C%20%ED%95%84%EB%93%9C%EC%97%90%EC%84%9C%20%EC%84%A0%ED%96%89%200%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
단일 헤더와 많은 레코드가 포함된 플랫 파일(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이면 필드가 사라지는 대신 끝에 그대로 유지됩니다.