如何编辑第二次出现的重复行?

如何编辑第二次出现的重复行?

我正在寻找一种方法来查找所有不是“不是颜色”的重复行,并在第二次出现的末尾添加“是一种颜色”。

这是diff -y我正在谈论的一个内容。

orginal file  - final resault

pink            pink
pink          | pink is a color
not a color     not a color
not a color     not a color 
violet          violet
violet        | violet is a color
not a color     not a color
not a color     not a color
orange          orange
orange        | orange is a color
not a color     not a color

答案1

awk方法:

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=$0" is a color" : nl }}' file

输出:

pink
pink is a color
not a color
not a color
violet
violet is a color
not a color
not a color
orange
orange is a color
not a color

您可以使用 '获取行变量' 从 awk 的输入中读取下一条记录到变量中变量

获取线命令返回1如果它找到一条记录并且0如果遇到文件末尾。

$0!="not a color" && $0 == nl- 如果当前记录不是not a color字符串并且 2 个连续行相等(重复)


使用函数的另一种方法(在关键重复“颜色”的前 2 个字符之后substr()插入字符串):" is a color "

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=substr($0,1,2)" is a color "substr($0,3) : nl }}' file

输出将是:

pink
pi is a color nk
not a color
not a color
violet
vi is a color olet
not a color
not a color
orange
or is a color ange
not a color

答案2

从目前提供的信息来看:

sed 'N;s/^\([a-z]*\)\n\1$/& is a colour/;$! P;$! D' file

该模式[a-z]*可能需要适应您的需求。当然它不仅仅匹配颜色,这里它匹配每个小写字母的单词。

说明:每行的脚本是将以下行附加到 command N,因此您总是有连续的行,中间有换行符。然后,s将第一行的模式作为\1换行符之后的反向引用,因此它仅匹配重复的行。在这种情况下,&替换字符串中会插入整体匹配并将给定文本附加到第二行。然后P打印到第一个换行符并D删除这部分,因此第二行仍然需要重新开始。$!使这些命令对除最后一行之外的所有命令执行,因为对于最后一行,我们需要输出这两行,默认情况下,这发生在脚本的末尾。

测试输入:

pink
pink
not a colour
not a colour
orange
orange
not a colour
red
blue
blue

给出输出:

pink
pink is a colour
not a colour
not a colour
orange
orange is a colour
not a colour
red
blue
blue is a colour

答案3

sed -e '
   # not interested in empty lines or blank lines
   /^$/b
   /\S/!b

   N;                        # get the next line into pattern space
   /^\(.*\)\n\1$/!{P;D;};    # compare 2 in the pattern space as string eq
   /\nnot a color$/b;        # 2 EQUAL, they are "not a color" => NOP
   s/$/ is a color/;         # 2 EQUAL, but not "not a color" => suffix
' your_colors.file

答案4

awk '/Not a color/ { print } /pink|red|blue|red|orange/ { if( found[$1] ) { print $1, "is a color" } else { print $1; found[$1]=1 } }' /path/to/input

相关内容