请参阅此主题: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
命令,只保留最后一行并输出文件的其余部分为好。我已经做了很长时间了,但我只能找到与我想要的相反的解决方案。
答案 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行,如果第一行与第二行相同则不打印第一行。