删除了上面的记录以及txt文件中匹配的主键

删除了上面的记录以及txt文件中匹配的主键

我正在尝试在进行 txt 处理时删除一些匹配的记录

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

代码:

awk -v add='tag1,slate1,flag1,status1,5,6' '
BEGIN{ FS=OFS=","; split(add, arr, ",") }
($1==arr[1] && $2==arr[2] && $3==arr[3] && $4=="status0") { append=$5 FS $6 }
END{ print add, (append?append:"NULL,NULL") }' list.txt

这将给出输出:tag1,slate1,flag1,status1,5,6,0,1

一旦我得到输出,我需要删除此记录“tag1,slate1,flag1,status0,0,1”之前带有“tag1,slate1,flag1”的匹配记录[仅从该记录中我们得到了“0,1”值来输出]

然后需要将输出记录添加到list.txt末尾

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
tag1,slate1,flag1,status1,5,6,0,1

有什么建议么?

答案1

您可以使用 2 遍方法,首先识别与目标值匹配的行,然后打印所有适当的行:

awk -v add='tag1,slate1,flag1,status1,5,6' '
    BEGIN {
        FS=OFS=","
        split(add,arr)
    }
    NR==FNR {
        if ( ($1==arr[1]) && ($2==arr[2]) && ($3==arr[3]) && ($4=="status0") ) {
            append = $5 OFS $6
            matchFnr = FNR
        }
        next
    }
    !( (FNR < matchFnr) && ($1==arr[1]) && ($2==arr[2]) && ($3==arr[3]) )
    END {
        print add OFS (append ? append : "NULL,NULL")
    }
' list.txt list.txt
tag2,slate2,flag2,status0,2,3
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
tag1,slate1,flag1,status1,5,6,0,1

答案2

使用GNU sed流编辑器实用程序我们将从数据生成 sed 代码来操作数据本身。

< list.txt sed -ne '/^tag1,slate1,flag1,status0,/=' |
sed -Ee '$!d
  s/.*/1,&!ba\n&!{/;a\
/^tag1,slate1,flag1,/d;b\
}\
h;:a\
p;$!d;g;s/0,/1,5,6,/
' |
sed -f - list.txt
  • 第一步,我们获取与 ** tag1,slate1,flag1,status0** 匹配的最后一行的编号
  • 然后根据这个数字,我们编写 sed 代码来完成我们的任务
  • 要查看第二次 sed 调用产生了什么代码,请注释最后一次 sed 调用。

输出:

tag2,slate2,flag2,status0,2,3
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
tag1,slate1,flag1,status1,5,6,0,1

相关内容