Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何使用awk格式化输出文件_Shell_Awk - Fatal编程技术网

Shell 如何使用awk格式化输出文件

Shell 如何使用awk格式化输出文件,shell,awk,Shell,Awk,我有一个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 tex

我有一个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命令,但没有得到任何线索,如有任何帮助,将不胜感激
谢谢

您可以使用以下内容:

output | gawk '{split($2, a, /,/); for (i=1; i <= length(a); i++) {printf "%s %s\n\n", $1, a[i]}}'
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扩展。

另一个使用
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

你可以把线折叠一次

sed -r 's/([^ ]* +)([^,]*),(.*)/\1\2\n\n\1\3/g' file
重复它需要一个标记和一个跳跃

sed -r ': a;s/([^ ]* +)([^,]*),(.*)/\1\2\n\n\1\3/g; t a' file

$awk-F'[,]+'{for(i=2;ithanks@accdias..我正在查找手册页,仍然试图了解下面一行的“$2”是如何被关联的
data3text4,text5,text6,text7,text8,text9,text10,text12,text11,text13
,“这行将被拆分成一行
$1==“data3”
$2=”“text4,text5,text6,text7,text8,text9,text10,text12,text11,text13”
。然后
拆分($2,a,“,”)
将用逗号分隔的每个$2的值填充数组
a
。您的任何评论在这种情况下都会产生任何影响。而且您迟到了12个半小时。不用担心,我为我的不良行为道歉。您的评论非常受欢迎,@Ed Morton。您真的希望在每个输入行之间都有一个空行,并且在输出中也有相同的内容吗Ed:你好,ED?我不需要在输出之间的空行,但是如果它有大量的记录,它将是很好的使它更可读。
$ 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