【问题标题】:How can I use awk (or cut) to print the last field per line from a pipe separated file?如何使用 awk(或 cut)从管道分隔文件中打印每行的最后一个字段?
【发布时间】:2017-05-02 13:22:04
【问题描述】:

我有一个这样的文件

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}' 可能就是您所需要的

标签: linux awk cut


【解决方案1】:

试试这个 -

 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

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

【讨论】:

  • 这正是我想要的!非常感谢!
  • 欢迎@Valonqar :)
【解决方案2】:

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

这匹配到最后一个|,并在| 之后包含尽可能多的空格,然后删除匹配项。

【讨论】:

    【解决方案3】:

    还原每一行,用cut读取第一列,还原:

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

    【讨论】:

    • 我没有投反对票,但它似乎有点令人费解,与仅使用 sed 's/.*| //' input 或类似的相比,它会留下一个前导空白字符,所以也许这就是为什么?
    【解决方案4】:

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

    cut -c81- inputFile
    

    这将为您提供每行中从位置 81 开始的所有字符,这大致就在我观察数据时。一些试验和错误会给出一个更准确的值来代替81,因为我可能会被一对夫妇 - 我的眼球不像以前那么年轻:-)

    【讨论】:

      【解决方案5】:

      看来您只需要输入的第 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-
      

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2010-09-17
            • 2014-04-07
            • 1970-01-01
            • 2011-04-26
            • 2020-12-06
            • 1970-01-01
            • 2021-07-28
            • 2022-01-05
            • 2015-02-11
            相关资源
            最近更新 更多