如何在从第一列重复值时将具有多个值的列拆分为多行?

时间:2019-09-11 19:10:24

标签: awk sed zsh

我正在尝试获取所有CVE和我的Erratas的列表,CVE列用逗号分隔。我需要用换行符分隔,并输出相应的勘误表

我可以使用sed或awk完成此操作,但不确定如何开始

当前输出:

RHSA-2017:3221  CVE-2016-10167, CVE-2016-10168
RHSA-2015:2369  CVE-2015-3248
RHSA-2015:1534  CVE-2014-9715, CVE-2015-2666, CVE-2015-2922, CVE-2015-3636

所需的输出:

RHSA-2017:3221  CVE-2016-10167
RHSA-2017:3221  CVE-2016-10168
RHSA-2015:2369  CVE-2015-3248
RHSA-2015:1534  CVE-2014-9715
RHSA-2015:1534  CVE-2015-2666
RHSA-2015:1534  CVE-2015-2922
RHSA-2015:1534  CVE-2015-3636

更新(已解决): awk '{errata=$1; for(i=2; i<NF; i++) {print errata,$i}}' FS=',? +' OFS=' ' /C/Temp/ERRATACVETEST.txt  我对赛勒斯做了一些改动,将i<=NF更改为i<NF,它产生了我想要的结果,谢谢!

3 个答案:

答案 0 :(得分:2)

使用GNU awk:

awk '{errata=$1; for(i=2; i<=NF; i++) {print errata,$i}}' FS=',? +' OFS='  ' file

输出:

RHSA-2017:3221  CVE-2016-10167
RHSA-2017:3221  CVE-2016-10168
RHSA-2015:2369  CVE-2015-3248
RHSA-2015:1534  CVE-2014-9715
RHSA-2015:1534  CVE-2015-2666
RHSA-2015:1534  CVE-2015-2922
RHSA-2015:1534  CVE-2015-3636

请参见The Stack Overflow Regular Expressions FAQ8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -E 's/^((\S+\s+)[^,]+),\s*/\1\n\2/;P;D' file

用换行符替换第一个字段及其在行中每个逗号的间距。

答案 2 :(得分:0)

Cyrus帖子的变体:

awk -F',? *' '{for (i=2;i<=NF;i++) print $1,$i}' file
RHSA-2017:3221 CVE-2016-10167
RHSA-2017:3221 CVE-2016-10168
RHSA-2015:2369 CVE-2015-3248
RHSA-2015:1534 CVE-2014-9715
RHSA-2015:1534 CVE-2015-2666
RHSA-2015:1534 CVE-2015-2922
RHSA-2015:1534 CVE-2015-3636