如何使用awk(或cut)从管道分隔文件中每行打印最后一个字段?

时间:2017-05-02 13:22:05

标签: linux awk cut

我有一个像这样的文件

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

但有时它不起作用或者错过了一些单词。

你能帮我吗?

7 个答案:

答案 0 :(得分: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

如果这不是您想要的输出,请发布您的预期输出。

答案 1 :(得分:2)

使用sed:将最长的匹配替换为thisthing.replaceData = function (thisTemplate, htmlList, htmlOverlayer, dataJs, indexLi) { //thisTemplate = thisTemplate.replace('%%img%%', '/B2C/ResourcesWebRevise/booking/thisthing/custom/' + dataJs + '.jpg'); thisTemplate = thisTemplate.replace('%%title%%', thisthingData.title); thisTemplate = thisTemplate.replace('%%desc%%', thisthingData.desc); thisTemplate = thisTemplate.replace('%%cta%%', thisthingData.cta); // bridge cta thisTemplate = thisTemplate.replace('%%list%%', htmlList); thisTemplate = thisTemplate.replace('%%overlayer%%', htmlOverlayer); thisthing.print(thisTemplate, dataJs, indexLi); }

|

如果您不想要领先的空白,请将其删除:

$ 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 匹配,并在|之后包含尽可能多的空格,然后删除匹配。

答案 2 :(得分:0)

恢复每一行,阅读带剪切的第一列,还原为:

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

答案 3 :(得分:0)

看起来您最好使用awk |字符作为字段分隔符(awk -F'|')但是,如果它们总是很好地排列像这样,cut可能是更好的选择:

cut -c81- inputFile

这将为你提供每一行中81位以上的所有字符,这些大致正好从我眼睛注视数据。一些试验和错误会给出一个更准确的值来代替81,因为我可能会被一对夫妇带走 - 我的眼球不像以前一样年轻: - )

答案 4 :(得分:0)

您似乎只想要输入的第7个| - 分隔字段:

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-

答案 5 :(得分:0)

我假设最后一个字段是指最后一列。这就是你需要的:

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

在这种情况下,它将打印文件的最后一列。

答案 6 :(得分: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

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