awkを使用してcsvを生成するときに発生する問題

awkを使用してcsvを生成するときに発生する問題

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

おすすめ記事