我从一个shell脚本得到了以下格式的输出文件
data text1
data1 text2
data3 text4,text5,text6,text7,text8,text9,text10,text12,text11,text13
data4 text53
data23 text45,text65,text98,text65`
我想进一步更改输出的格式,如下所示,以使其更具可读性
data text1
data1 text2
data3 text4
data3 text5
data3 text6
data3 text7
data3 text8
data3 text9
data3 text10
data4 text53
data23 text45
data23 text65
data23 text98
data23 text65
请建议如何使用awk/sed实现相同的功能?尝试查找awk命令,但没有得到任何线索,如有任何帮助将不胜感激
发布于 2018-06-02 22:51:46
$ awk -F'[ ,]+' '{for (i=2;i<=NF;i++) print $1, $i ORS}' file
data text1
data1 text2
data3 text4
data3 text5
data3 text6
data3 text7
data3 text8
data3 text9
data3 text10
data3 text12
data3 text11
data3 text13
data4 text53
data23 text45
data23 text65
data23 text98
data23 text65
发布于 2018-06-02 07:43:54
您可以使用类似以下内容:
output | gawk '{split($2, a, /,/); for (i=1; i <= length(a); i++) {printf "%s %s\n\n", $1, a[i]}}'
其中output
是脚本生成的输出。
或者,您可以像这样运行它:
gawk '{split($2, a, /,/); for (i=1; i <= length(a); i++) {printf "%s %s\n\n", $1, a[i]}}' output_file
编辑以修复@Ed Morton指出的错误,并将awk
替换为gawk
,因为length(array)
是一个GNU扩展。
发布于 2018-06-02 14:15:02
另一个是使用gsub
连接到,
$ awk '{gsub(/,/, ORS ORS $1 OFS )}1' file
...
data3 text4
data3 text5
data3 text6
...
但是,例如,如果$1
中包含&
,则会出现问题,因为它会被替换为匹配项:
$ cat file
data& text4,text5,text6
$ awk '{gsub(/,/, ORS ORS $1 OFS )}1' file
data& text4
data, text5
data, text6
用另一个gsub
修复这个问题
$ awk '{gsub(/,/, ORS ORS $1 OFS ); gsub(/,/,"\\&")}1' file
data& text4
data& text5
data& text6
https://stackoverflow.com/questions/50652067
复制相似问题