对于这种情况,你需要你的“主题”文本从您的数据分开。
使用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
这不会产生正确的输出。 – 2014-09-03 21:49:30
用户没有以前的工作。这使他在途中。 – sastorsl 2014-09-04 04:48:46
做了一个小小的编辑。 – sastorsl 2014-09-04 06:37:58