perl -F, -lane '
exists $h{$F[0]} or $h[$h{$F[0]}=@h]=$_;
$h=$_; /,false$/ or $_=$h for $h[$h{$F[0]}];
END{ print for @h; }
' duplicates.file
데이터 구조 :
%h
키가 첫 번째 필드 (AAA, BBB, CCC 등) 인 해시 와 해당 값은 키가 발생한 순서를 나타내는 숫자입니다. 따라서, 예를 들어, 키 AAA => 0, 키 BBB => 1, 키 CCC => 2입니다.
@h
인쇄 순서에 포함 된 선이 요소 인 배열 . 따라서 데이터에서 true와 false가 모두 발견되면 false 값이 배열로 이동합니다. OTW, 한 가지 유형의 데이터가 있다면 이것이 존재할 것입니다.
또 다른 방법은 GNU sed를 사용하는 것입니다.
sed -Ee '
G
/^([^,]*),(false|true)\n(.*\n)?\1,\2(\n|$)/ba
/^([^,]*)(,true)\n(.*\n)?\1,false(\n|$)/ba
/^([^,]*)(,false)\n((.*\n)?)\1,true(\n|$)/{
s//\3\1\2\5/;h;ba
}
s/([^\n]*)\n(.*)$/\2\n\1/;s/^\n*//
h;:a;$!d;g
' duplicates.file
위의 GNU 코드에 대한 POSIX 코드는 다음과 같습니다.
sed -e '
G
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(false\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2$/ba
/^\([^,]*\),\(true\)\n\(.*\n\)\{0,1\}\1,\2\n/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false$/ba
/^\([^,]*\),true\n\(.*\n\)\{0,1\}\1,false\n/ba
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true$/{
s//\3\1\2/
h
ba
}
/^\([^,]*\)\(,false\)\n\(\(.*\n\)\{0,1\}\)\1,true\n/{
s//\3\1\2\n/
h
ba
}
y/\n_/_\n/
s/\([^_]*\)_\(.*\)$/\2_\1/;s/^_*//
y/\n_/_\n/
h;:a;$!d;g
' duplicates.file
설명
- 이 방법에서는 최종적으로 인쇄 될 결과를 보류 공간에 저장합니다.
- 판독 된 모든 라인에 대해, 홀드 공간의 기존 상태에 대한 현재 라인의 검사를 위해 홀드 공간을 패턴 공간에 추가합니다.
- 이제이 비교 중에 5 가지 일이 발생할 수 있습니다.
- a) 현재 줄은 보류 줄 & false : false 어딘가에 일치합니다.
- [조치] 동일한 잘못된 상태가 발견되었으므로 아무 것도 수행하지 마십시오.
- b) 현재 줄은 보류 줄의 어딘가와 일치합니다. & true : true.
- [조치] 동일한 참 상태가 발견되었으므로 아무 것도 수행하지 마십시오.
- c) 현재 라인은 홀드 라인의 어딘가와 일치합니다. & true : false.
- [조치] 잘못된 상태가 이미 있으므로 아무 것도하지 마십시오.
- d) 현재 줄은 보류 줄의 어딘가와 일치합니다. & false : true.
- [조치] 여기에는 실제 위치와 정확히 같은 위치에서 잘못된 라인을 교체해야한다는 점에서 약간의 작업이 필요합니다.
- e) 현재 라인은 홀드 라인의 어느 곳과도 일치하지 않습니다.
결과
AA,false
BB,false
CC,false
DD,true
true
첫 번째 열의 첫 번째 인스턴스 인 경우 에만 유지 합니까?