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

时间:2015-08-04 18:24:19

标签: linux shell unix awk sed

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

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

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

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

我将如何在shell脚本中执行此操作。单行会很棒。

我知道这一行会为每一行添加一个字符(#),

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

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

这可能适合你(GNU sed):

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

使用-r开关删除一些反斜杠,使眼睛的正则表达更容易。假设每一行都与下一行不同,并将#附加到当前行的末尾(也可以使用它作为删除行尾的空格的机会)。附加下一行并对其进行测试,以查看其开头是否与前一行有相同的五个字符。如果是,则删除附加的#,然后打印并删除模式空间中两行的第一行。重复,直到处理完所有行。

答案 2 :(得分:1)

$ cat tst.awk
{ curr = substr($0,1,5) }
NR>1 { printf "%s\n", (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 "%s\n",(prev==curr?"":"#")} {printf "%s",$0; prev=curr} END{print "#"}' file