열 값과 일치하지 않는 행 데이터 가져오기

열 값과 일치하지 않는 행 데이터 가져오기

파일(1600줄)을 읽고 행을 가져오려고 하는데 열의 값만 다르고(sno1, sno2, sno3 및 sno4 - 값과 같아서는 안 됨) 50%보다 높아야 합니다. 아래에 주어진 출력 예

input.txt(탭으로 구분)

id sno1 sno2 sno3 sno4
R1 98.4 88.8 98.4 67.6
R2 100  100  100  100
R3 33.4 23.5 98.8 45.5
R4 53.5 78.7 88.8 67.5
R5 0    0    0    0
R6 88.8 98.8 67.6 100

출력.txt

R4 53.5 78.7 88.8 67.5
R6 88.8 98.8 67.6 100

R4행과 R6행에서는 모든 열 값이 서로 같지 않고 50%를 초과합니다. awk/sed/perl에 대한 도움을 주시면 감사하겠습니다.

답변1

Perl-oneliner:

perl -nae 'undef %saw ; next if $. == 1; shift @F; next if grep { $_ < 50 or $saw{$_}++ } @F;  print ' input.txt

이는 기본적으로 다음과 같이 해석됩니다.

#!/usr/bin/env perl
use strict;

while (<>) {
  my @F = split(' ');  # split the current line
  my %seen;
  next if $. == 1;  # skip the heading
  shift @F;  # ignore first element

  next if grep { $_ < 50 or $seen{$_}++ } @F;  # ignore lines with
                                               # duplicate entries and
                                               # entries less than 50
  print;  # print current line
}

답변2

이것은 당신에게 도움이 될 수 있습니다 (GNU sed):

sed '1d;/\S\+ \(\S\+\) .* \1/d;/\S\+ \S\+ \(\S\+\) .* \1/d;/\S\+ \S\+ \S\+ \(\S\+\) .* \1/d;/\S\+\( \(100\|[56789][0-9]\..\)\)\{4\}/!d' file

답변3

각 필드를 행의 다른 필드와 비교하여 동일하지 않은지 확인할 수 있으며, 각 필드를 비교하여 값이 50개를 초과하는지 확인할 수도 있습니다.

awk '($2!=$3) &&($2!=$4) && ($2!=$5) && ($3!=$4) &&($3!=$5) &&($4!=$5) && ($2>50) && ($3>50) && ($4>50) && ($5>50) {print $0}' input.txt 

추신: 열 수가 고정되어 있다고 가정합니다.

관련 정보