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

Linux 比较连续行的前5个字符-shell脚本,linux,shell,unix,awk,sed,Linux,Shell,Unix,Awk,Sed,我有一个文件,上面有以下几行 00070MICHAEL 00071MARY 00071JOHN 00085ERIC 00085PETER 00097MICHAEL 我想在每行末尾添加一个字符(#),其前五个字符与下一行的前五个字符不同 00070MICHAEL# 00071MARY 00071JOHN# 00085ERIC 00085PETER# 00097MICHAEL# 我将如何在shell脚本中实现这一点。一艘邮轮就好了 我知道这一行会在

我有一个文件,上面有以下几行

00070MICHAEL  
00071MARY  
00071JOHN  
00085ERIC  
00085PETER  
00097MICHAEL  
我想在每行末尾添加一个字符(#),其前五个字符与下一行的前五个字符不同

00070MICHAEL#  
00071MARY  
00071JOHN#  
00085ERIC  
00085PETER#  
00097MICHAEL#  
我将如何在shell脚本中实现这一点。一艘邮轮就好了

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

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

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

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

这可能适用于您(GNU-sed):

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

这可能适用于您(GNU-sed):

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

这可能适用于您(GNU-sed):

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

$ 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
当然,如果你觉得有用的话,你可以把它全部塞进一行:

awk '{curr=substr($0,1,5)} NR>1{printf "%s\n",(prev==curr?"":"#")} {printf "%s",$0; prev=curr} END{print "#"}' file
当然,如果你觉得有用的话,你可以把它全部塞进一行:

awk '{curr=substr($0,1,5)} NR>1{printf "%s\n",(prev==curr?"":"#")} {printf "%s",$0; prev=curr} END{print "#"}' file
当然,如果你觉得有用的话,你可以把它全部塞进一行:

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


编写代码将是一个良好的开端。我们不是来为你工作的。你写一些代码,我们(也许)会帮你修复。结果文件的顺序重要吗?@Marc B。我添加了一行代码。我不知道接下来该怎么做。这就像说“这里,我有一把锤子。我已经尽了我的责任,你建造了摩天大楼的其余部分”。@Marc B,我看到这个网站上的大多数问题都是这样回答的。我不明白这个问题有什么不同。编写代码将是一个好的开始。我们不是来为你工作的。你写一些代码,我们(也许)会帮你修复。结果文件的顺序重要吗?@Marc B。我添加了一行代码。我不知道接下来该怎么做。这就像说“这里,我有一把锤子。我已经尽了我的责任,你建造了摩天大楼的其余部分”。@Marc B,我看到这个网站上的大多数问题都是这样回答的。我不明白这个问题有什么不同。编写代码将是一个好的开始。我们不是来为你工作的。你写一些代码,我们(也许)会帮你修复。结果文件的顺序重要吗?@Marc B。我添加了一行代码。我不知道接下来该怎么做。这就像说“这里,我有一把锤子。我已经尽了我的责任,你建造了摩天大楼的其余部分”。@Marc B,我看到这个网站上的大多数问题都是这样回答的。我不明白这个问题有什么不同。编写代码将是一个好的开始。我们不是来为你工作的。你写一些代码,我们(也许)会帮你修复。结果文件的顺序重要吗?@Marc B。我添加了一行代码。我不知道接下来该怎么做。这就像说“这里,我有一把锤子。我已经尽了我的责任,你建造了摩天大楼的其余部分”。@Marc B,我看到这个网站上的大多数问题都是这样回答的。我不明白这个问题有什么不同。谢谢Ed!工作完美:)谢谢Ed!工作完美:)谢谢Ed!工作完美:)谢谢Ed!工作完美:)谢谢阿努巴瓦。但它并没有像预期的那样起作用。在测试时,无论条件如何,每两行都会添加字符“#”。谢谢Anubhava。但它并没有像预期的那样起作用。在测试时,无论条件如何,每两行都会添加字符“#”。谢谢Anubhava。但它并没有像预期的那样起作用。在测试时,无论条件如何,每两行都会添加字符“#”。谢谢Anubhava。但它并没有像预期的那样起作用。在测试时,无论条件如何,它都会为每两行添加字符“#”。