Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 UNIX:在UNIX中递归地将子字符串粘贴到同一字符串中_Shell_Unix_Awk_Sed_Cut - Fatal编程技术网

Shell UNIX:在UNIX中递归地将子字符串粘贴到同一字符串中

Shell UNIX:在UNIX中递归地将子字符串粘贴到同一字符串中,shell,unix,awk,sed,cut,Shell,Unix,Awk,Sed,Cut,我的档案如下: $ cat a Server1 - free space: / 60% : /opt 40%: /var 50% Server2 - free space: / 50% : /opt 30%: /var 60% Server3 - free space: / 30% : /opt 50%: /var 40% $ cat b Server1 - free space: / 60% Server1 - free space: /opt 40% Server1 -

我的档案如下:

$ cat a 
Server1 - free space: / 60% : /opt 40%: /var 50%    
Server2 - free space: / 50% : /opt 30%: /var 60%    
Server3 - free space: / 30% : /opt 50%: /var 40%
$ cat b
Server1 - free space: / 60% 
Server1 - free space: /opt 40%
Server1 - free space: /var 50%
Server2 - free space: / 50% 
Server2 - free space: /opt 30%
Server2 - free space: /var 60%
Server3 - free space: / 30% 
Server3 - free space: /opt 50%
Server3 - free space: /var 40%
输出将写入另一个文件b。我的预期产出如下:

$ cat a 
Server1 - free space: / 60% : /opt 40%: /var 50%    
Server2 - free space: / 50% : /opt 30%: /var 60%    
Server3 - free space: / 30% : /opt 50%: /var 40%
$ cat b
Server1 - free space: / 60% 
Server1 - free space: /opt 40%
Server1 - free space: /var 50%
Server2 - free space: / 50% 
Server2 - free space: /opt 30%
Server2 - free space: /var 60%
Server3 - free space: / 30% 
Server3 - free space: /opt 50%
Server3 - free space: /var 40%

$awk-F'*:*'-vofs=':''{for(i=2;i
$awk-F'*:*'-vofs=':''{for(i=2;i对于这种情况,您需要将“主题”文本与数据分开

有了awk,您可以免费获得它,因为它解析每个输入行,并将每个字段放入编号的变量中-$1、$2,等等。 您还可以免费获得由awk计算的每一行的实际字段数NF

鉴于此,您可以从

awk '{ print $1, $2 }' a

Output: Server1 -
不完全是你想要的

您可以继续手动计数,甚至只是硬编码一些文本:

awk '{ Subject=$1" "$2" "$3" "$4 ; print Subject, $5, $6, "\n" Subject, $8, $9, "\n" Subject, $10, $11 }' b
虽然,这会打印您的输出,但它不是很优雅。但是,您会对字段有一种感觉

当awk将一行拆分为字段时,我会说一个字段是由空格包围的任何字段,即。 通过使用命令行参数“-F”或在BEGIN块中显式设置它,可以更改awk用作字段分隔符的内容

开始块在awk查看文件之前运行一次

那么你可以这样做:

awk 'BEGIN { FS=":" } { print $1, $2 }' a

Output: Server1 - free space  / 60%
因此,您离目标越来越近了,但您也希望在输出之前有一个分号,因此:

awk 'BEGIN { FS=":" } { print $1 ":", $2 }' a

# Or, by setting OFS - the Output Field Separator
awk 'BEGIN { FS=":" ; OFS=":" } { print $1,$2 }' a

Output: Server1 - free space: / 60%
您的输出中仍然只有一个文件系统,因此您也需要引用这些文件系统,如果您确定您的输入中始终只有三个文件系统,则可以直接进行引用:

$ awk 'BEGIN { FS=":" ; OFS=":" } { print $1,$2 "\n" $1, $3 "\n" $1, $4 }' a

Server1 - free space: / 60%
Server1 - free space: /opt 40%
Server1 - free space: /var 50%
但您需要的是一个循环,它为您提供了所遇到的文件系统/字段数量方面的灵活性,您可以从Ed Morton的答案中得到答案,我刚刚将FS(字段分隔符)和OFS(输出字段分隔符)的声明移动到BEGIN块:

$ awk 'BEGIN { FS=":" ; OFS=":" } {for (i=2;i<=NF;i++) print $1, $i}' a > b
$ cat b
Server1 - free space: / 60%
Server1 - free space: /opt 40%
Server1 - free space: /var 50%
Server2 - free space: / 50%
Server2 - free space: /opt 30%
Server2 - free space: /var 60%
Server3 - free space: / 30%
Server3 - free space: /opt 50%
Server3 - free space: /var 40%

$awk'BEGIN{FS=“:”;OFS=“:”}{for(i=2;i在这种情况下,您需要将“主题”文本与数据分开

有了awk,您可以免费获得它,因为它解析每个输入行,并将每个字段放入编号的变量中-$1、$2,等等。 您还可以免费获得由awk计算的每一行的实际字段数NF

鉴于此,您可以从

awk '{ print $1, $2 }' a

Output: Server1 -
不完全是你想要的

您可以继续手动计数,甚至只是硬编码一些文本:

awk '{ Subject=$1" "$2" "$3" "$4 ; print Subject, $5, $6, "\n" Subject, $8, $9, "\n" Subject, $10, $11 }' b
虽然,这会打印您的输出,但它不是很优雅。但是,您会对字段有一种感觉

当awk将一行拆分为字段时,我会说一个字段是由空格包围的任何字段,即。 通过使用命令行参数“-F”或在BEGIN块中显式设置它,可以更改awk用作字段分隔符的内容

开始块在awk查看文件之前运行一次

那么你可以这样做:

awk 'BEGIN { FS=":" } { print $1, $2 }' a

Output: Server1 - free space  / 60%
因此,您离目标越来越近了,但您也希望在输出之前有一个分号,因此:

awk 'BEGIN { FS=":" } { print $1 ":", $2 }' a

# Or, by setting OFS - the Output Field Separator
awk 'BEGIN { FS=":" ; OFS=":" } { print $1,$2 }' a

Output: Server1 - free space: / 60%
您的输出中仍然只有一个文件系统,因此您也需要引用这些文件系统,如果您确定您的输入中始终只有三个文件系统,则可以直接进行引用:

$ awk 'BEGIN { FS=":" ; OFS=":" } { print $1,$2 "\n" $1, $3 "\n" $1, $4 }' a

Server1 - free space: / 60%
Server1 - free space: /opt 40%
Server1 - free space: /var 50%
但您需要的是一个循环,它为您提供了所遇到的文件系统/字段数量方面的灵活性,您可以从Ed Morton的答案中得到答案,我刚刚将FS(字段分隔符)和OFS(输出字段分隔符)的声明移动到BEGIN块:

$ awk 'BEGIN { FS=":" ; OFS=":" } {for (i=2;i<=NF;i++) print $1, $i}' a > b
$ cat b
Server1 - free space: / 60%
Server1 - free space: /opt 40%
Server1 - free space: /var 50%
Server2 - free space: / 50%
Server2 - free space: /opt 30%
Server2 - free space: /var 60%
Server3 - free space: / 30%
Server3 - free space: /opt 50%
Server3 - free space: /var 40%
$awk'BEGIN{FS=“:”;OFS=“:”}{for(i=2;i