如何使用 awk(或 cut)从管道分隔文件中打印每行的最后一个字段?
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}'
但有时它不起作用或漏掉一些单词。
你能帮帮我吗?
还原每一行,用 cut 阅读第一列,还原:
rev input | cut -f1 -d\| | rev
看起来你最好使用 awk
和 |
字符作为字段分隔符 (awk -F'|'
),但是,如果它们总是很好地排列像这样,cut
可能是更好的选择:
cut -c81- inputFile
这将为您提供每一行中从位置 81 开始的所有字符,这 大致 就在我目测数据的时候。一些试验和错误会给出一个更准确的值来代替 81
因为我可能会被一对夫妇关闭 - 我的眼球不像以前那么年轻:-)
试试这个 -
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
如果这不是您想要的输出,那么请post您的预期输出。
看来您只需要输入的第 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
如果你想删除前导 space,你也可以使用 cut
删除它:
cut -d\| -f7- | cut -c2-
我假设最后一个字段是指最后一列。这就是您所需要的:
awk -F'\|' '{print }' MyFile
在这种情况下,它将打印文件的最后一列。
使用 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
这匹配到最后一个 |
,并在 |
之后包含尽可能多的空格,然后删除匹配。
您可以使用 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
我有一个这样的文件
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}'
但有时它不起作用或漏掉一些单词。
你能帮帮我吗?
还原每一行,用 cut 阅读第一列,还原:
rev input | cut -f1 -d\| | rev
看起来你最好使用 awk
和 |
字符作为字段分隔符 (awk -F'|'
),但是,如果它们总是很好地排列像这样,cut
可能是更好的选择:
cut -c81- inputFile
这将为您提供每一行中从位置 81 开始的所有字符,这 大致 就在我目测数据的时候。一些试验和错误会给出一个更准确的值来代替 81
因为我可能会被一对夫妇关闭 - 我的眼球不像以前那么年轻:-)
试试这个 -
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
如果这不是您想要的输出,那么请post您的预期输出。
看来您只需要输入的第 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
如果你想删除前导 space,你也可以使用 cut
删除它:
cut -d\| -f7- | cut -c2-
我假设最后一个字段是指最后一列。这就是您所需要的:
awk -F'\|' '{print }' MyFile
在这种情况下,它将打印文件的最后一列。
使用 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
这匹配到最后一个 |
,并在 |
之后包含尽可能多的空格,然后删除匹配。
您可以使用 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