我有一个包含以下行的文件。
00070MICHAEL
00071MARY
00071JOHN
00085ERIC
00085PETER
00097MICHAEL
我想在每行的末尾添加一个字符(#),其前五个字符与下一行不同'前五个字符。
00070MICHAEL#
00071MARY
00071JOHN#
00085ERIC
00085PETER#
00097MICHAEL#
我将如何在shell脚本中执行此操作。单行会很棒。
我知道这一行会为每一行添加一个字符(#),
awk '{$0=$0 "#"}1' filename
谢谢!
答案 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