【问题标题】:How to KEEP only the last line of consecutive lines starting with the same word?如何只保留以相同单词开头的连续行的最后一行?
【发布时间】:2015-03-05 15:57:45
【问题描述】:

看到这个帖子:How to remove the second line of consecutive lines starting with the same word?

我不想保留以“TITLE”开头的第一个重复的连续行,而是只保留最后一个,以便从此输入中获取:

标题一些东西
DATA 一些数据
TITLE 别的东西
DATA 一些其他数据
TITLE 更多
TITLE 额外信息
DATA 更​​多数据

这个输出:

标题一些东西
DATA 一些数据
TITLE 别的东西
DATA 一些其他数据
TITLE 额外信息
DATA 更​​多数据

另外,我希望能够处理任意数量的重复,而不仅仅是 2(例如,如果连续 7 行以“TITLE”开头,则只保留最后一个)。

和其他帖子一样,它可以是perl/bash/sed/awk 命令,只保留最后一行并输出文件的其余部分。我已经为此工作了很长时间,但我只能找到与我想要的相反的解决方案。

【问题讨论】:

    标签: bash perl awk sed


    【解决方案1】:

    使用 sed:

    sed '/^TITLE/ { :a $! { N; /\nTITLE/ { s/.*\n//; ba; }; }; }' filename
    

    即:

    /^TITLE/ {          # if a line begins with TITLE
      :a                # jump label for looping.
       $! {             # unless we hit the end of input (in case the file
                        # ends with title lines)
         N              # fetch the next line
         /\nTITLE/ {    # if it begins with TITLE as well
           s/.*\n//     # remove the first
           ba           # go back to a
         }
       }
     }
    

    【讨论】:

      【解决方案2】:

      只需颠倒行的顺序,然后打印现在第一次出现,然后再次颠倒它们:

      $ tac file | awk '$1!=prev; {prev=$1}' | tac                  
      TITLE something
      DATA some data
      TITLE something else
      DATA some other data
      TITLE extra info
      DATA some more data
      

      或者如果可以有多个连续的 DATA 行并且您想保留所有这些:

      $ tac file | awk '!($1=="TITLE" && $1==prev); {prev=$1}' | tac
      TITLE something
      DATA some data
      TITLE something else
      DATA some other data
      TITLE extra info
      DATA some more data
      

      【讨论】:

        【解决方案3】:

        如果您正在寻找 Perl 单行解决方案,例如您链接的问题中的解决方案,那么就可以了

        perl -ne'if (/^TITLE/) {$t = $_} else {print $t, $_; $t = ""}' myfile
        

        请注意,它不会打印 TITLE 行,除非它后面跟着不以 TITLE 开头的行

        【讨论】:

        • 如果标题可以出现在最后一行,则需要添加END { print $title }
        【解决方案4】:

        这可能对你有用(GNU sed):

        sed -r 'N;/^(TITLE ).*\n\1/!P;D' file
        

        这会比较两行,如果第一行与第二行相同,则不打印第一行。

        【讨论】:

          猜你喜欢
          • 2013-03-04
          • 1970-01-01
          • 1970-01-01
          • 2011-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多