2014-09-03 58 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