아래와 같은 파일이 있습니다.
key1 key2 key3
a1 2 l1
a1 2.5 l2
a2 2 l2
a3 2.5 l3
a3 2.1 l4
a3 2.2 l5
key2
조건을 만족 key1
하고 key3
한 번만 발생하는 가능한 최대 합계를 찾으려고 합니다 . 위 파일의 경우 출력은 다음과 같을 것으로 예상됩니다.
a1 2 l1
a2 2 l2
a3 2.5 l3
다음 명령을 사용하면
sort -nk2 file | perl -ane '$k{$F[$1]}=$_; END{print "$k{$_}" for keys(%k)}'
내가 얻는 결과는,
a2 2 l2
a1 2.5 l2
a3 2.5 l3
그러나 출력에서 한 번만 key1
합계를 얻고 key3
예상 출력에서 설명하는 최대 합계를 얻고 싶습니다.
편집하다
아래와 같은 입력 파일이 있습니다.
a0 11.1 l6
a0 3 l1
a1 14.0 l6
a1 2.5 l2
a2 11.1 l2
a2 2 l2
a3 13.3 l8
a3 2.1 l4
a3 2.5 l7
a4 1.6 l6
a4 1.7 l1
수동으로 볼 수 있듯이 위 파일의 최대 가중치 출력은 다음과 같습니다.
a0 11.1 l6
a2 11.1 l2
a3 13.3 l8
a4 1.7 l1
Gnouc의 명령에 따르면 awk
내가 얻는 결과는 다음과 같습니다.
a0 11.1 l6
a1 2.5 l2
a3 13.3 l8
a4 1.7 l1
terdon의 명령에 따르면 perl
내가 얻는 결과는 다음과 같습니다.
a2 2 l2
a4 1.7 l1
a3 13.3 l8
편집 3
a1 1 l1
a2 3 l2
a1 4 l3
a3 5 l2
a6 4 l5
a7 3 l2
내가 얻는 결과는,
a3 5 l2
a6 4 l5
a7 3 l2
보시다시피 l2
이것은 두 번 반복됩니다.
답변1
각각의 첫 번째 항목만 얻으려는 것 같습니다 key1
.
그러면 예상한 결과가 생성됩니다.
$ awk '!($1 in a){print;a[$1]}' file
a1 2 l1
a2 2 l2
a3 2.5 l3
고쳐 쓰다
네가 원한다면key1
또는 key3
한 번만 발생해야 합니다.
$ awk '!($1 in a) && !($3 in a){print;a[$1];a[$3]}' 1.txt
a1 2 l1
a2 2 l2
a3 2.5 l3
업데이트 2
귀하의 의견을 읽은 후 해결책은 다음과 같습니다.
$ sort -rnk2 file | awk '!a[$1]++' | awk '!a[$3]++'
a1 14.0 l6
a3 13.3 l8
a2 11.1 l2
a4 1.7 l1
답변2
당신이 해야 할 일은 Perl 스크립트에 테스트를 추가하는 것뿐입니다. 키가 세 번째 필드인 다른 해시를 사용하고 해당 필드가 아직 없는 경우에만 각 줄을 인쇄합니다.
$ sort -nk2 file | perl -ane '$k{$F[$1]}=$_ unless $s{$F[2]}++>0;
END{print "$k{$_}" for keys(%k)}'
a3 2.5 l3
a2 2 l2
a1 2 l1
참고: 이는 헤더도 인쇄하지만 귀하의 메서드도 헤더를 인쇄하며 출력에 표시하지 않기 때문에 헤더가 실제로 파일의 일부가 아니라고 가정합니다.