기본 키를 사용하여 동일한 유형의 마지막 레코드 값 가져오기

기본 키를 사용하여 동일한 유형의 마지막 레코드 값 가져오기

안녕하세요. 기본 키를 사용하여 동일한 유형의 마지막 레코드 값을 가져오려고 합니다.

목록.csv

tag1,slate1,flag1,check1,1,2
tag2,slate2,flag2,check2,1,2
tag3,slate3,flag3,check3,1,2
tag1,slate1,flag1,check1,3,4
tag3,slate3,flag3,check3,1,2

여기서 기본 키는 col1+col2+col3+col4입니다.

이 레코드에 새 레코드를 삽입 해야 합니다. tag1,slate1,flag1,check1,5,6동일한 유형의 마지막 레코드를 가져와야 합니다. [레코드가 많은 경우 마지막 동일한 기본 키 레코드를 가져와야 합니다.] [tag1,slate1,flag1,check1,3,4 ] 그리고 3 ,4 값을 가져오고 다음 레코드와 같이 만듭니다.

tag1,slate1,flag1,check1,5,6,3,4

노력하고 있지만 예상한 결과를 얻지 못했습니다.

awk -F, '!dup[$1,$2,$3,$4]++' list.csv - removing duplicates , but able to fetch expected record


awk -F, '!dup["tag1","slate1","flag1","check1"]++' list.csv

"tag1,slate1,flag1,check1,5,6" 값을 입력하고 아래와 같은 출력을 기대하겠습니다.

tag1,slate1,flag1,check1,5,6,3,4

"tag4,slate4,flag4,check4,8,9" 레코드가 존재하지 않으면 출력은 다음과 같습니다.

tag4,slate4,flag4,check4,8,9,NILL,NILL

답변1

awk -v add='tag1,slate1,flag1,check1,5,6' '
BEGIN{ FS=OFS=","; split(add, arr, ",") }

($1==arr[1] && $2==arr[2] && $3==arr[3] && $4==arr[4]) { append=$5 FS $6 }
END{ print add, (append?append:"NULL,NULL") }' infile

산출:

tag1,slate1,flag1,check1,5,6,3,4

아니면 다른 방법으로 수행하세요.

awk -v add='tag4,slate4,flag4,check4,8,9' '
BEGIN{ FS=OFS="," }

{ key=$1 FS $2 FS $3 FS $4; if(index(add, key)==1) append=$5 FS $6 }
END{ print add, (append?append:"NULL,NULL") }' infile

산출:

tag4,slate4,flag4,check4,8,9,NULL,NULL

답변2

add='tag1,slate1,flag1,check1,5,6'
awk -F ',' -v add="$add" '
BEGIN {
  key = add; sub(/(,[^,]+){2}$/, "", key)
  tupl = ",NIL,NIL"
}
{
  do{
    if (index($0, key FS) == 1)
      tupl = FS $(NF-1) FS $NF
  } while (getline > 0)
  $0 = add tupl
};1
' list.csv
tag1,slate1,flag1,check1,5,6,3,4

GNU sed확장 정규식 모드 켜짐-E

# helper variables that make it easy to look
# at n process the pattern space in terms of fields
s=,        S="[^$s]"
F=$s$S+   F2="($F){2}"
add='tag1,slate1,flag1,check4,5,6'
sed -Ee "
  1{H;z;x;s/^/$add/;ba;}

  :loop
    \$tend
    N
    :a
    /^(.*)$F2\n\1$F2\$/h
    s/\n.*//
  bloop

  :end
  G;s/\n\$/,NIL,NIL/;t
  g;s/\n.*($F2\$)/\1/
" list.csv
tag1,slate1,flag1,check4,5,6,NIL,NIL

관련 정보