對於這種情況,你需要你的「主題」文本從您的數據分開。
使用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