AWK를 사용하여 csv 파일을 만들려고 합니다. 열에 쉼표를 추가하기 위해 출력 파일 구분 기호를 사용하고 있습니다. 그런데 이름이 공백으로 구분되어 출력에서도 쉼표로 처리되는 열이 있습니다.
cat test.txt | head -n 3
Vulnerability ID Package Severity Fix Vulnerability URL
CVE-2017-1000408 libc-bin-2.24-11+deb9u3 High 2.24-11+deb9u4 https://security-tracker.debian.org/tracker/CVE-2017-1000408
CVE-2017-1000408 libc-dev-bin-2.24-11+deb9u3 High 2.24-11+deb9u4 https://security-tracker.debian.org/tracker/CVE-2017-1000408
주문하다:
cat test.txt | awk -F' ' 'BEGIN{OFS=",";} {print $1,$2,$3,$4,$5;}' > file.csv
산출:
Vulnerability,ID,Package,Severity,Fix
CVE-2017-1000408,libc-bin-2.24-11+deb9u3,High,2.24-11+deb9u4,https://security-tracker.debian.org/tracker/CVE-2017-1000408
CVE-2017-1000408,libc-dev-bin-2.24-11+deb9u3,High,2.24-11+deb9u4,https://security-tracker.debian.org/tracker/CVE-2017-1000408
예상 출력:
Vulnerability ID,Package,Severity,Fix,Vulnerability URL
CVE-2017-1000408,libc-bin-2.24-11+deb9u3,High,2.24-11+deb9u4,https://security-tracker.debian.org/tracker/CVE-2017-1000408
CVE-2017-1000408,libc-dev-bin-2.24-11+deb9u3,High,2.24-11+deb9u4,https://security-tracker.debian.org/tracker/CVE-2017-1000408
답변1
내 제안은 문서의 나머지 부분과 다르게 헤더 줄을 자세히 설명하는 것입니다. 이 특별한 경우:
awk 'NR==1 {$0=gensub(/(Vulnerability) (ID|URL)/, "\\1_\\2", "g"); print gensub(/(Vulnerability)_(ID|URL)/, "\\1 \\2", "g", $1","$2","$3","$4","$5)} NR>1 {print $1","$2","$3","$4","$5}' test.txt > file.csv
또는:
sed -r '1s/(Vulnerability) (ID|URL)/\1_\2/g' test.txt | awk '{print $1","$2","$3","$4","$5}' | sed -r '1s/(Vulnerability)_(ID|URL)/\1 \2/g' > file.csv
댓글에서 매우 적합한 제안, 특히 여러 공백 문자로 분할하는 제안과 다른 도구를 사용하여 CSV 파일을 조작하라는 제안을 받았습니다. 또한 문제가 머리글 행에만 있는 경우에는 제가 직접 문제를 해결해 드리겠습니다. 그리고...진심이에요?필요제목에 공백이 있나요? (이 아니라 Vulnerability_URL
)? 그것은 모두 실제 사용 사례에 따라 다릅니다.
나에게는 여러 공간을 분할하는 것이 가장 쉬운 것 같습니다.
sed 's/ */,/g' test.txt > file.csv