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

Bash 如何仅保留以同一单词开头的连续行的最后一行?,bash,perl,awk,sed,Bash,Perl,Awk,Sed,请参阅此线程: 与其保留以“TITLE”开头的第一个重复的连续行,我只想保留最后一行,以从该输入中获取: 标题某事 数据一些数据 标题:其他内容 数据一些其他数据 标题更多 标题附加信息 数据更多的数据 此输出: 标题某事 数据一些数据 标题:其他内容 数据一些其他数据 标题附加信息 数据更多的数据 此外,我希望能够处理任意数量的重复,而不仅仅是2次(例如,如果一行中有7行以“TITLE”开头,则只保留最后一行) 与另一篇文章一样,它可以是一个perl/bash/sed/awk命令,只保留最后一

请参阅此线程:

与其保留以“TITLE”开头的第一个重复的连续行,我只想保留最后一行,以从该输入中获取:

标题某事
数据一些数据
标题:其他内容
数据一些其他数据
标题更多
标题附加信息
数据更多的数据

此输出:

标题某事
数据一些数据
标题:其他内容
数据一些其他数据
标题附加信息
数据更多的数据

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

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

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

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

$ 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
或者,如果可以有多个连续的数据行,并且您希望保留所有这些数据行:

$ 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

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

perl -ne'if (/^TITLE/) {$t = $_} else {print $t, $_; $t = ""}' myfile
请注意,它根本不会打印
标题
行,除非后面有一行不是以
标题
开头。这可能适用于您(GNU-sed):


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

如果标题可以出现在最后一行,则需要添加
END{print$title}
sed -r 'N;/^(TITLE ).*\n\1/!P;D' file