如何仅保留以相同单词开头的连续行的最后一行?

时间:2015-03-04 22:30:24

标签: bash perl awk sed

请参阅此主题:How to remove the second line of consecutive lines starting with the same word?

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

  

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

此输出:

  

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

此外,我希望能够处理任意数量的重复,而不仅仅是2(例如,连续7行连续开始#34; TITLE"只保留最后一个一个)。

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 2 :(得分:1)

如果您正在寻找Perl单行解决方案,例如您链接的问题中的解决方案,那么这样做

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

请注意,除非后面跟不是以TITLE

开头的行,否则它不会打印TITLE

答案 3 :(得分:1)

这可能适合你(GNU sed):

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

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