簡體   English   中英

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

[英]How can I use awk (or cut) to print the last field per line from a pipe separated file?

我有一個這樣的文件

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}'

但有時它不起作用或遺漏了一些單詞。

你能幫我嗎?

嘗試這個 -

 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

如果這不是您期望的輸出,請發布您的期望輸出。

使用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

這匹配到最后一個| 並在|之后包含盡可能多的空格| ,然后刪除匹配項。

還原每一行,以剪切方式讀取第一列,然后還原:

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

看起來您最好將awk| 字符作為字段分隔符( awk -F'|' ),但是,如果始終像這樣將它們很好地對齊,則cut可能是一個更好的選擇:

cut -c81- inputFile

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

看來您只想要第七| 輸入的定界字段:

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-

我假設在最后一個字段中,您指的是最后一列。 這是您需要的:

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

在這種情況下,它將打印文件的最后一列。

您可以使用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

您還可以使用Bash參數擴展:

$ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM