2017-10-11 67 views
0

我有一個包含2列的大文本文件。第一列很大且很複雜,但包含一個name="..."部分。第二欄只是一個數字。從第一列中提取子串

如何生成一個文本文件,使第一列僅包含名稱,但第二列保持不變並顯示數字?基本上,我想只從第一列提取一個子串,並讓第二列保持不變。

的樣本數據:

application{id="1821", name="app-name_01"} 0 
application{id="1822", name="myapp-02", optionalFlag="false"} 1 
application{id="1823", optionalFlag="false", name="app_name_public"} 3 
... 

所以結果文件將是這樣的

app-name_01  0 
myapp-02  1 
app_name_public 3 
... 
+0

線條是否相似或名稱可以在該列中的任何位置?顯示一些示例數據。 – fancyPants

+0

該名稱可以在該列中的任何位置,所以我需要使用正則表達式(例如'name =「([a-zA-Z0-9 _-]))'來匹配它,其中parens含義是在組 –

+0

您已經顯示結果,但請顯示樣本輸入。 – Bohemian

回答

3

如果您的實際INPUT_FILE是一樣的樣本所示,然後下面的代碼可以幫助你在相同的。

awk '{sub(/.*name=\"/,"");sub(/\".* /," ")} 1' Input_file 

輸出如下。

app-name_01 0 
myapp-02 1 
app_name_public 3 
+1

謝謝,這個作品! –

+0

@delusional,歡迎您,很高興它爲您提供幫助。 – RavinderSingh13

0

使用GNU awk

$ awk 'match($0,/name="([^"]*)"/,a){print a[1],$NF}' infile 
app-name_01 0 
myapp-02 1 
app_name_public 3 

非Gawk的

awk 'match($0,/name="([^"]*)"/){t=substr($0,RSTART,RLENGTH);gsub(/name=|"/,"",t);print t,$NF}' infile 
app-name_01 0 
myapp-02 1 
app_name_public 3 

輸入:

$ cat infile 
application{id="1821", name="app-name_01"} 0 
application{id="1822", name="myapp-02", optionalFlag="false"} 1 
application{id="1823", optionalFlag="false", name="app_name_public"} 3 
... 
+0

恐怕這不適用於我的真實數據,這更復雜。樣本數據是非常基本的,但提供與真實結構完全匹配的樣本數據幾乎是不可能的。謝謝,抱歉! –

0

這裏有一個sed解決方案:

sed -r 's/.*name="([^"]+).* ([0-9]+)$/\1 \2/g' Input_file 

說明:

隨着括號您的商店羣什麼的插圖中。
第一組是name="之後的所有內容,直到第一個"[^"]的意思是「不是雙引號」。
第二組僅僅是「一行或一行以上的數字,前面有一個空格」。