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。但它并没有像预期的那样起作用。在测试时,无论条件如何,它都会为每两行添加字符“#”。