2015-06-08 86 views
1

我有一個文件,它看起來像這樣:分割文件轉換成列使用awk

1. result = 1.2.3.4 (1.2.3.4) 
    info: [Affected] 

2. result = www.addr.com (2.3.4.5) 
    info: [not Affected] 

現在我想將它分三路拆分,例如:

1.2.3.4  1.2.3.4 Affected 
www.addr.de 2.3.4.5 not Affected 

我用awk的即:cat filename.txt | awk -F "[=()'']" '{print $2 $3 $4}'

但我仍然沒有得到連續三列。我該如何解決它?第二個問題:有沒有比awk更好的選擇?

回答

4

可以取消設置記錄分隔符在每個塊分別讀取,這樣的:

$ cat file 
1. result = 1.2.3.4 (1.2.3.4) 
    info: [Affected] 

2. result = www.addr.com (2.3.4.5) 
    info: [not Affected] 
$ awk -F'[]=():[:space:][]+' -v RS= '{print $3, $4, $6 (NF==8?" " $7:"")}' file 
1.2.3.4 1.2.3.4 Affected 
www.addr.com 2.3.4.5 not Affected 

在端三元處理字段(7或8的兩個不同的號碼,這取決於「受影響的」或「不受影響」)。如果有8個字段,則第7個字段會在空格後打印,否則,不會打印任何內容。

實現更整齊的格式化輸出,你可以使用printf代替print

$ awk -F'[]=():[:space:][]+' -v RS= '{printf "%-12s%10s %s%s%s", $3, $4, $6, (NF==8?" " $7:""), ORS}' file 
1.2.3.4  1.2.3.4 Affected 
www.addr.com 2.3.4.5 not Affected 

的格式說明規定每個字段的寬度。 A -會導致內容左對齊。 ORS是輸出記錄分隔符,默認情況下在您的平臺上是換行符。

就列對齊而言,這取決於您是在尋找人機還是機器可讀的東西。如果您希望將這些數據導入到電子表格中,也許可以使用製表符\t(例如)將每列分開,這可以通過將-v OFS='\t'添加到我的答案的第一個版本中完成。

3

您需要將該部分讀取爲單條記錄,可以使用RS=(無)在GAWK中執行此操作。這將塊作爲記錄讀取。

awk -vRS= -F"[)(=\n]+" '{print $2 $3 $4}' file 

1.2.3.4 1.2.3.4 Affected 
www.addr.com 2.3.4.5 not Affected 
+0

得到以下異常:AWK:無效-v選項,而沒有 「V」 它工作正常,但忽略了最低顯示第三列 – Loretta

+0

@Loretta你在使用GNU awk嗎?試試'-v RS =「\ n \ n」'。 – 123

+1

聽起來像你可能沒有GNU awk。如果你不需要在'-v'和'RS'之間有一個空格。 –

1

一些更awk

輸入

$ cat file 
1. result = 1.2.3.4 (1.2.3.4) 
    Affected 

2. result = www.addr.com (2.3.4.5) 
    not Affected 

輸出

$ awk 's{print $0}s=/^[0-9]+\./{ gsub(/[()]/,"");printf ("%s %s", $4,$5);next}' file 
1.2.3.4 1.2.3.4 Affected 
www.addr.com 2.3.4.5 not Affected 

- 編輯 - 爲修訂輸入

$ cat file 
1. result = 1.2.3.4 (1.2.3.4) 
    info: [Affected] 

2. result = www.addr.com (2.3.4.5) 
    info: [not Affected] 

輸出

$ awk '{gsub(/[()\[\]]/,"")}s{$1="";print $0}s=/^[0-9]+\./{printf ("%s %s", $4,$5);next}' file 
1.2.3.4 1.2.3.4 Affected 
www.addr.com 2.3.4.5 not Affected