【问题标题】:delete last 3 columns from a file从文件中删除最后 3 列
【发布时间】:2014-01-03 04:55:59
【问题描述】:

我有一个包含 6 列的文本文件。如何从该文件中删除最后三列?

c1  c2  c3  c4  c5   c6

想要的输出

c1  c2  c3

【问题讨论】:

    标签: shell unix sed awk


    【解决方案1】:

    如果间距不重要,这里是删除最后 3 个字段的方法。

    awk '{NF-=3}1' file
    c1 c2 c3
    

    你甚至可以使用

    awk 'NF-=3' file
    

    但它没有第一个例子那么健壮。

    【讨论】:

      【解决方案2】:

      如果列由单个空格分隔:

      cut -d " " -f1-3 file
      

      如果列被多个空格分隔:

      tr -s " " file | cut -d " " -f1-3
      

      如果列由制表符分隔:

      cut -f1-3 file
      

      【讨论】:

        【解决方案3】:

        你可以使用@paxdiablo的awk来减少NF的值

        您也可以使用sed

        sed 's/\([ \t]\+[^ \t]*\)\{3\}$//' your_file
        

        如果您在 Linux 上,GNU sed 提供 -r

        sed -r 's/([ \t]+[^ \t]*){3}$//' your_file
        

        【讨论】:

        • 我最初想使用第一个技巧,但不幸的是它仍然在字段之间留下空格。我认为更好的方法是简单地将NF 减少 3。
        • 是的,看到您的编辑,而不是将列设置为空,减少 NF 会更好,谢谢。
        【解决方案4】:

        纯 bash(如果间距不重要):

        tr -s ' ' < file | rev | cut -d' ' -f4- | rev
        

        如果有尾随空格,请使用cut -d' ' -f5-,或在这些空格之前修剪尾随空格。

        但我确实更喜欢 Jotne/paxdiablo 的 awk NF 解决方案。

        【讨论】:

          【解决方案5】:

          要删除每行中最后的N 列,您可以简单地将NF(字段数)减少该数量,同时考虑到没有足够的列可以删除的特殊情况):

          pax> echo c1 c2 c3 c4 c5 c6 | awk -vN=3 '{if(NF<N){NF=0}else{NF-=N}print}'
          c1 c2 c3
          

          请记住,awk 主要是一种用于处理数据列的工具。您会注意到我的输出在字段之间有一个空格,因为基于列的处理通常不关心空格的类型。

          如果间距很重要(例如,您希望保留列之间的空格数),您可能应该考虑使用其他工具。

          【讨论】:

          • +1 for this awk,之前我想将最后 3 列设置为空,这将留下空格字符,并且没有考虑少于 3 列的行,谢谢。但是你可以使用'{if(NF&lt;N){NF=0}else{NF-=N}}1'而不是'{if(NF&lt;N){NF=0}else{NF-=N}print}'
          • 这会改变字段的间距。 (两个空格)
          • @Jotne,如果您正在处理字段,它们之间的空白可以是 any 空白。如果你想保留它们,你就不会使用像 awk 这样的工具来处理字段。
          • 我知道,我只是评论说您的输出与 OP 的输出不完全相同,您应该记下它。看我的帖子。
          • @Jotne,现在我明白了。澄清。
          【解决方案6】:

          awk '{print $1 " " $2 " " $3}' filename &gt; filename.new

          【讨论】:

          • @Hamad OP 没有说明如何获得结果,因此这与此处的任何其他帖子一样好。他只说delete last 3 columns from a file 就可以了。和Backspace 一样:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多