Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何仅保留下一行相同的行_Bash_Shell_Awk_Sed - Fatal编程技术网

Bash 如何仅保留下一行相同的行

Bash 如何仅保留下一行相同的行,bash,shell,awk,sed,Bash,Shell,Awk,Sed,我尝试使用sed命令解析一个文件,并只在下一行保留重复的行 例 写在一个名为test的文件中 预期产量 我的shell命令 输出 我想知道这个命令怎么了?为什么我得到了另外两行???如果你对awk没问题,请尝试一下下面的内容 awk 'prev==$0 && prev{print} {prev=$0}' Input_file 或 说明:现在为上述代码添加说明 awk ' ##Starting awk program here. prev==$0

我尝试使用sed命令解析一个文件,并只在下一行保留重复的行

例 写在一个名为test的文件中

预期产量 我的shell命令 输出 我想知道这个命令怎么了?为什么我得到了另外两行???

如果你对awk没问题,请尝试一下下面的内容

awk 'prev==$0 && prev{print} {prev=$0}' Input_file

说明:现在为上述代码添加说明

awk '                 ##Starting awk program here.
prev==$0 && prev{     ##Checking condition if prev variable is equal to current line and prev is NOT NULL.
  print               ##Printing the current line then, as per OP request.
}                     ##Closing BLOCK for prev==$0 && prev condition here.
{
  prev=$0             ##Setting variable prev to current line.
}
' Input_file          ##Mentioning Input_file name here(which is getting passed to awk).
如果你对awk还满意的话,请尝试一下下面的内容

awk 'prev==$0 && prev{print} {prev=$0}' Input_file

说明:现在为上述代码添加说明

awk '                 ##Starting awk program here.
prev==$0 && prev{     ##Checking condition if prev variable is equal to current line and prev is NOT NULL.
  print               ##Printing the current line then, as per OP request.
}                     ##Closing BLOCK for prev==$0 && prev condition here.
{
  prev=$0             ##Setting variable prev to current line.
}
' Input_file          ##Mentioning Input_file name here(which is getting passed to awk).
我不建议将sed用于此任务

但是,您尝试的命令只有一个小问题。您需要完全比较下一行,因此在\1之后添加$anchor

如果没有锚定,line将匹配line1、linexyaz等字符串。如果更改输入使其不存在部分匹配,则命令将有效

$ cat ip.txt
line
line
line
cline1
line
zline3
line1
line2
line2
line
$ sed -nE '$!N; /^(.*)\n\1/P; D' ip.txt
line
line
line2
我不建议将sed用于此任务

但是,您尝试的命令只有一个小问题。您需要完全比较下一行,因此在\1之后添加$anchor

如果没有锚定,line将匹配line1、linexyaz等字符串。如果更改输入使其不存在部分匹配,则命令将有效

$ cat ip.txt
line
line
line
cline1
line
zline3
line1
line2
line2
line
$ sed -nE '$!N; /^(.*)\n\1/P; D' ip.txt
line
line
line2
GNU sed 4.2.2支持-z:

GNU sed 4.2.2支持-z:


这看起来正是unid-d所做的。在下一行各有一份副本。-第二行不应该在输出中,第二行之后的下一行是第2行。@KamilCuk uniq-d在这里不起作用,因为我认为OP希望n-1行被保留为n个连续的重复行。每个OP只保留在下一行有重复的行,为什么预期输出中有第二行?这看起来正是unid-d所做的。在下一行各有一份副本。-第二行不应该在输出中,第二行之后的下一行是第2行。@KamilCuk uniq-d在这里不起作用,因为我认为OP希望n-1行被保留为n个连续的重复行。每个OP只保留在下一行有重复的行,为什么预期输出中有第二行?我觉得没有必要检查空行。p==0美元;{p=$0}应该可以。检查空行对我来说似乎没有必要。p==0美元;{p=$0}应该可以。也许sed-n'n;/^\*\\n\1$/P;D’文件足够了吗?是的,足够了。-E选项用于扩展正则表达式sed,默认sed启用了基本正则表达式-n'n;/^\*\\n\1$/P;D’文件足够了吗?是的,足够了。-E选项用于扩展正则表达式sed,默认情况下已启用基本正则表达式
awk '                 ##Starting awk program here.
prev==$0 && prev{     ##Checking condition if prev variable is equal to current line and prev is NOT NULL.
  print               ##Printing the current line then, as per OP request.
}                     ##Closing BLOCK for prev==$0 && prev condition here.
{
  prev=$0             ##Setting variable prev to current line.
}
' Input_file          ##Mentioning Input_file name here(which is getting passed to awk).
$ sed -nE '$!N; /^(.*)\n\1$/P; D' ip.txt
line
line
line2
$ cat ip.txt
line
line
line
cline1
line
zline3
line1
line2
line2
line
$ sed -nE '$!N; /^(.*)\n\1/P; D' ip.txt
line
line
line2
sed -rz ':a;s/(^|\n)([^\a\n]*)\n\2\n/\1\2\a\n\2\n/g;ta;' test | sed -rn 's/\a$//p'