我正在尝试用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发布于 2019-05-16 10:02:40
我的建议是与文件的其他部分不同,详细说明标题行。在这种情况下:
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文件的建议。此外,如果您的问题仅存在于标题行中,如果我是您,我将手动修复它。And...do,您真的需要在标题中有空格(而不是Vulnerability_URL)?这完全取决于您的实际用例。
对我来说,在多个空间上分裂似乎是最容易的:
sed 's/ */,/g' test.txt > file.csvhttps://unix.stackexchange.com/questions/519212
复制相似问题