2017-05-02 63 views
0

我有這樣的如何使用awk(或剪切)從管道分隔文件中打印每行的最後一個字段?

14618 | 184.72.251.121 | 184.72.128.0/17  | US | arin  | 2010-01-26 | AMAZON-AES - Amazon.com, Inc., US 
14618 | 107.21.223.240 | 107.21.128.0/17  | US | arin  | 2011-05-03 | AMAZON-AES - Amazon.com, Inc., US 
16509 | 52.85.180.156 | 52.85.180.0/23  | US | arin  |   | AMAZON-02 - Amazon.com, Inc., US 
61337 | 85.199.214.99 | 85.199.212.0/22  | GB | ripencc | 2005-02-08 | ECOM-AS ============================================, GB 
31034 | 94.177.187.22 | 94.177.160.0/19  | IT | ripencc | 2008-08-14 | ARUBA-ASN, IT 
8816 | 212.45.144.206 | 212.45.128.0/19  | IT | ripencc |   | IT-STCOM, IT 

文件我必須提取的最後一個字段和它的所有的內容。請注意,有時倒數第二列是空的。

我試圖

awk 'BEGIN { ORS = " "}; {for(i=13;i<NF;++i) print $i}' 

但有時它不工作,或者錯過了一些話。

你能幫助我嗎?

+0

可以請你加預期的產出,以便清楚你需要什麼?一個簡單的'awk -F'\'' '{print $ NF}''可能是你需要的 – Sundeep

回答

2

試試這個 -

awk -F'|' '{print $NF}' file 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-02 - Amazon.com, Inc., US 
ECOM-AS ============================================, GB 
ARUBA-ASN, IT 
IT-STCOM, IT 

如果這不是您想要的輸出,那麼請發佈您的預期輸出。

+0

這就是我正在尋找的!非常感謝! – Valonqar

+0

歡迎@Valonqar :) –

0

還原每一行,讀與切割中第一欄,回覆:

rev input | cut -f1 -d\| | rev 
+0

爲什麼downvote?我經常使用它,速度很快。 – choroba

+0

我沒有降低它的效果,但它似乎有點令人費解,它會留下一個空白字符,而不是使用'sed's /.* | //'輸入'或類似的所以也許這就是爲什麼? –

0

它看起來就像你使用awk|字符作爲字段分隔符(awk -F'|')會更好,但是,如果他們「再總是會被很好地一字排開這樣,cut可能是一個更好的選擇:

cut -c81- inputFile 

這將使你從81個位置中的所有字符起在每行,這是大概正好從我眼睛看數據。試錯的位將給出一個更準確的值代替81使用,因爲我可以用一對夫婦離開 - 我的眼球都不像年輕時那樣他們曾經是:-)

0

看來,你只是想你輸入的第7 | -delimited領域:

cut -d\| -f7 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-02 - Amazon.com, Inc., US 
ECOM-AS ============================================, GB 
ARUBA-ASN, IT 
IT-STCOM, IT 

如果你想擺脫領先的空間,您可以刪除與cut太:

cut -d\| -f7- | cut -c2- 
0

我假設你最後一欄指的是最後一欄。這是你需要的:

awk -F'\|' '{print $7}' MyFile 

它會在這種情況下打印文件的最後一列。

2

With sed:用最長的匹配替代|

$ sed 's/.*|//' infile 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-02 - Amazon.com, Inc., US 
ECOM-AS ============================================, GB 
ARUBA-ASN, IT 
IT-STCOM, IT 

如果你不希望前面的空格,刪除它們,以及:

$ sed 's/.*|[[:blank:]]*//' infile 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-02 - Amazon.com, Inc., US 
ECOM-AS ============================================, GB 
ARUBA-ASN, IT 
IT-STCOM, IT 

這件事匹配到最後|,包括儘可能多的空白儘可能|後,再刪除比賽。

+0

非常感謝!這也是一個很好的答案! – Valonqar

0

您可以使用grep

$ grep -o '[^|]*$' file 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-02 - Amazon.com, Inc., US 
ECOM-AS ============================================, GB 
ARUBA-ASN, IT 
IT-STCOM, IT 

如果你不想前導空格:

grep -o '[^|]*$' file | cut -d' ' -f2- 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-02 - Amazon.com, Inc., US 
ECOM-AS ============================================, GB 
ARUBA-ASN, IT 
IT-STCOM, IT 

您還可以使用猛砸參數擴展:

$ while read -r line; do echo ${line##*|}; done <file 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-AES - Amazon.com, Inc., US 
AMAZON-02 - Amazon.com, Inc., US 
ECOM-AS ============================================, GB 
ARUBA-ASN, IT 
IT-STCOM, IT 
相關問題