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