2014-09-03 49 views
0

我的文件如下:UNIX:一个子递归粘贴到相同的字符串在UNIX

$ 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% 

输出将被写入到另一个文件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% 

回答

4
$ awk -F' *: *' -v OFS=': ' '{for (i=2;i<=NF;i++) print $1, $i}' file 
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% 
1

对于这种情况,你需要你的“主题”文本从您的数据分开。

使用awk,您可以免费获得该文件,因为它解析了每个输入行,并将每个字段放入编号变量 - $ 1,$ 2等。 您还可以获得实际的字段数 - NF - 通过AWK

鉴于这种计算,你可以用

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 

Allthough,这将打印输出,这是不是很优雅。但是,你会感受到田野。

当awk将一行分割成字段时,我这样做是说一个字段是由空白包围的任何字段,即。 您可以通过使用命令行参数“-F”或在BEGIN块中显式设置它来更改awk使用的字段分隔符。

awk甚至查看文件之前,BEGIN块运行一次

,那么你可以这样做:

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=":" } 
    {servers++ ; for (i=2;i<=NF;i++) { print $1, $i ; sum++ } } 
    END { printf("\nParsed %i lines producing %i lines\n", servers, sum) }' a 
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% 

Parsed 3 lines producing 9 lines 
+1

这不会产生正确的输出。 – 2014-09-03 21:49:30

+0

用户没有以前的工作。这使他在途中。 – sastorsl 2014-09-04 04:48:46

+0

做了一个小小的编辑。 – sastorsl 2014-09-04 06:37:58