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

관련 정보