比较连续行的前5个字符-shell脚本



我有一个包含以下行的文件。

00070MICHAEL  
00071MARY  
00071JOHN  
00085ERIC  
00085PETER  
00097MICHAEL  

我想在每行的末尾添加一个字符(#(,其前五个字符与下一行的前五个不同。

00070MICHAEL#  
00071MARY  
00071JOHN#  
00085ERIC  
00085PETER#  
00097MICHAEL#  

我该如何在shell脚本中做到这一点。一个班轮就太好了。

我知道这行每行都加一个字符(#(,

awk '{$0=$0 "#"}1' filename

谢谢!

$ cat tst.awk
{ curr = substr($0,1,5) }
NR>1 { printf "%sn", (prev == curr ? "" : "#") }
{ printf "%s", $0; prev = curr }
END { print "#" }
$ awk -f tst.awk file
00070MICHAEL#
00071MARY
00071JOHN#
00085ERIC
00085PETER#
00097MICHAEL#

当然,如果你觉得有用的话,你可以把它全部塞进一行:

awk '{curr=substr($0,1,5)} NR>1{printf "%sn",(prev==curr?"":"#")} {printf "%s",$0; prev=curr} END{print "#"}' file

您可以使用awk:

awk 'NR%2 {s=$0; next} {printf "%s", s;
        print (substr($0, 1, 5) == substr(s, 1, 5)) ? "" : "#"; print}' file
00070MICHAEL#
00071MARY
00071JOHN#
00085ERIC
00085PETER#
00097MICHAEL

这可能对你有用(GNU sed(:

sed -r 's/s*$/#/;N;/^(.....).*n1/s/#n/n/;P;D' file

使用-r开关可以删除一些反斜杠,使正则表达式更直观。假设每一行与下一行不同,并在当前行的末尾附加一个#(也可以借此机会删除行末尾的空白(。附加下一行并测试它,看看它的开头是否有与前一行相同的五个字符。如果是,请删除附加的#,然后打印并删除图案空间中两行中的第一行。重复此操作,直到处理完所有行。

最新更新