![AWK 또는 SED를 사용하여 CSV 구문 분석](https://linux55.com/image/112958/AWK%20%EB%98%90%EB%8A%94%20SED%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20CSV%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D.png)
오랫동안 (AWK 또는 SED)를 사용하여 내 csv 파일을 정리하려고 합니다.
csv 파일은 다음과 같습니다.
id,name,contact-type,contact
"1","toto corp","tel","+123456789"
"1","toto corp","fax","+198765432"
"1","toto corp","site","totocorp.com"
"2","Namek corp","tel","+14377678563"
"2","Namek corp","fax","+19867334565"
"2","Namek corp","site","Namekcorp.com"
나는 다음과 같은 출력을 원합니다 :
id,name,tel,fax,site
"1","toto corp","+123456789","+198765432","totocorp.com"
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"
문의해 주셔서 감사합니다!
답변1
멍하니해결책:
awk 'BEGIN{ FS=OFS=","; print "id,name,tel,fax,site" }
{ gsub(/"/,"",$3); a[$1][$3]=$4; if(!a[$1]["name"]) a[$1]["name"]=$2; }
END { for(i in a) print i,a[i]["name"],a[i]["tel"],a[i]["fax"],a[i]["site"] }' file
산출:
id,name,tel,fax,site
"1","toto corp","+123456789","+198765432","totocorp.com"
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"
a[$1][$3]=$4
id
- 필드 값을 상위 키로 사용하고contact-type
필드 값을 중첩 배열의 키로 사용하는 다차원 배열
답변2
큰따옴표로 묶인 csv 필드 안에 쉼표가 없다고 가정하면 간단한 코드 sed
로 다음을 수행 할 수 있습니다.
sed -ne '
s/,/&\n/2;s/\n[^,]*,//;h
n;s/.*,//;H
n;s/.*,//;H
g;s/\n/,/gp
' yourfile.csv
결과
"1","toto corp","+123456789","+198765432","totocorp.com"
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"
답변3
또 다른 gnu awk:
$ awk -F, -v OFS="," 'NR==1{h=$0;next}{a[$1FS$2]=(NR==2?FS $4:a[$1FS$2] FS $4)} \
END{print h;for (k in a) print k a[k]}' file
#Output:
id,name,contact-type,contact
"2","Namek corp","+14377678563","+19867334565","Namekcorp.com"
"1","toto corp","+123456789","+198765432","totocorp.com"
awk가 배열을 반복하는 방식으로 인해 배열은 END 섹션에 정렬된 순서로 인쇄되지 않습니다.
답변4
awk
원래 사용자가 또는 을 사용하여 솔루션을 찾고 있다는 것을 알고 있지만 sed
이러한 도구는 CSV의 인용 규칙을 모르기 때문에 CSV를 구문 분석하는 방법을 아는 도구를 사용하여 솔루션을 시연하는 것이 좋습니다.
CSV 인식 도구 사용밀러( ) 및 mlr
필드의 값을 사용하여 필드에서 reshape
새 필드를 생성하는 작업 :contact-type
contact
$ mlr --csv reshape -s contact-type,contact file
id,name,tel,fax,site
1,toto corp,+123456789,+198765432,totocorp.com
2,Namek corp,+14377678563,+19867334565,Namekcorp.com
다시 말하지만 아름답게 인쇄된 상자 형식입니다.
$ mlr --c2p --barred reshape -s contact-type,contact file
+----+------------+--------------+--------------+---------------+
| id | name | tel | fax | site |
+----+------------+--------------+--------------+---------------+
| 1 | toto corp | +123456789 | +198765432 | totocorp.com |
| 2 | Namek corp | +14377678563 | +19867334565 | Namekcorp.com |
+----+------------+--------------+--------------+---------------+