我正在尝试从输入文件中删除一些记录。
list.txt
tag1,slate1,flag1,status0,8,1
tag2,slate2,flag2,status0,2,3
tag1,slate1,flag1,status1,8,1
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status0,0,1
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status1,1,2
tag2,slate2,flag2,status1,1,2
tag1,slate1,flag1,status1,3,4
预期输出:list.txt
tag2,slate2,flag2,status0,2,3
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status0,0,1 -> deleted records above this and matching [tag1,slate1,flag1]
tag2,slate2,flag2,status1,2,3
tag1,slate1,flag1,status1,1,2
tag2,slate2,flag2,status1,1,2
tag1,slate1,flag1,status1,3,4
我尝试使用代码:
sed '/tag2,slate2,flag2,status0/d' list1.txt
但此删除记录 tag1,slate1,flag1,status0,0,1, tag1,slate1,flag1,status1,1,2 等。
当记录达到 'tag1,slate1,flag1,status0,0,1 时,有什么方法可以停止 sed 吗?
并且未找到“tag1,slate1,flag1,status0”,则无需删除与“tag1,slate1,flag1”匹配的任何记录
任何获得输出的建议。
答案1
您可以使用awk
:
awk '
NR == FNR && /tag1,slate1,flag1,status0/{last_matching=FNR}
NR != FNR && FNR<last_matching && /tag1,slate1,flag1/{next}
NR != FNR
' list.txt list.txt
awk
读取文件两次。
- 第一次运行时 (
NR == FNR
) ...- 我们将最后一个匹配项
FNR
(= 文件的记录/行号)保存在变量中。
- 我们将最后一个匹配项
- 第二次运行时 (
NR != FNR
) ...- 我们将跳过所有匹配的行 (-->
/tag1,slate1,flag1/{next}
) - 但仅限于
last_matching
(-->FNR<last_matching
)。 - 并用 打印所有剩余的行
NR != FNR
。
- 我们将跳过所有匹配的行 (-->
答案2
使用sed流编辑器实用程序我们可以执行以下操作:
sed -ne ':top
/^tag1,slate1,flag1,status0,0,1$/!{
/^tag1,slate1,flag1,/!p;n
btop
}
:n;p;n;bn
' list.txt
- 在看到目标行之前,我们会继续打印不匹配的行。
- 一旦满足目标行,我们就会继续打印所有行,直到文件耗尽。