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