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