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