다음과 같은 큰 파일이 있습니다.
India 07 1800 BAHRAICH 42273 +28.4 +26.7 NA 997.1 1 NA NA
India 07 1800 BAHRAICH 42273 +28.4 +26.7 NA 997.1 NA NA NA
India 07 1800 BALASORE 42895 +29.0 +26.8 NA 999.7 NA NA NA
India 07 1800 BANGALORE 43295 +23.0 +17.4 908.1 geopotential_of_850mb_=_492 NA NA NA
India 07 1800 BANGALORE 43295 +23.0 +17.4 908.1 geopotential_of_850mb_=_492 Trace NA NA
India 07 1800 BAREILLY 42189 +28.4 +26.2 NA 997.4 NA NA NA
India 07 1800 BAREILLY 42189 +28.4 +26.2 NA 997.4 Trace NA NA
India 07 1800 BARMER 42435 +35.6 +22.6 NA 997.6 NA NA NA
India 07 1800 BHOPAL_BAIRAGHAR 42667 +23.6 +23.3 942.7 1000.5 13 NA NA
India 07 1800 BHOPAL_BAIRAGHAR 42667 +23.6 +23.3 942.7 1000.5 NA NA NA
India 07 1800 BHUBANESHWAR 42971 +28.0 +25.7 NA 1000.7 NA NA NA
India 07 1800 BHUJ-RUDRAMATA 42634 +29.6 +25.7 NA 999.5 NA NA NA
India 07 1800 BIKANER 42165 +33.8 +25.1 NA 994.0 NA NA NA
India 07 1800 BIKANER 42165 +33.8 +25.1 NA 994.0 NA NA NA
India 07 1800 BOMBAY_SANTACRUZ 43003 +29.0 +26.8 NA 1004.4 10 NA NA
India 07 1800 BOMBAY_SANTACRUZ 43003 +29.0 +26.8 NA 1004.4 NA NA NA
이 파일에서 라인 2-3은 "NA" 형식이고 어디에나 나타날 수 있는 하나의 항목을 제외하고는 동일합니다. 더 적은 수의 "NA"를 유지하고 싶습니다.
해결책을 찾을 수 없습니다.
나는 출력을 다음과 같이 원한다:
India 07 1800 BAHRAICH 42273 +28.4 +26.7 NA 997.1 1 NA NA
India 07 1800 BALASORE 42895 +29.0 +26.8 NA 999.7 NA NA NA
India 07 1800 BANGALORE 43295 +23.0 +17.4 908.1 geopotential_of_850mb_=_492 Trace NA NA
India 07 1800 BAREILLY 42189 +28.4 +26.2 NA 997.4 Trace NA NA
India 07 1800 BARMER 42435 +35.6 +22.6 NA 997.6 NA NA NA
India 07 1800 BHOPAL_BAIRAGHAR 42667 +23.6 +23.3 942.7 1000.5 13 NA NA
India 07 1800 BHUBANESHWAR 42971 +28.0 +25.7 NA 1000.7 NA NA NA
India 07 1800 BHUJ-RUDRAMATA 42634 +29.6 +25.7 NA 999.5 NA NA NA
India 07 1800 BIKANER 42165 +33.8 +25.1 NA 994.0 NA NA NA
India 07 1800 BOMBAY_SANTACRUZ 43003 +29.0 +26.8 NA 1004.4 10 NA NA
나는 그렇게 하는 논리에 감사할 수도 있다.
감사해요
답변1
가설열쇠은 네 번째 필드이고 동일한 키를 가진 레코드가 연속적입니다(귀하의 질문을 올바르게 이해했습니다). 다음과 같이 할 수 있습니다.
perl -lane '
$na = grep {$_ eq "NA"} @F;
if ($F[3] eq $last_key) {
if ($na < $min_na) {
$min_na = $na; $min = $_
}
} else {
print $min unless $. == 1;
$last_key = $F[3]; $min = $_; $min_na = $na;
}
END{print $min if $.}' < your-file
동일한 네 번째 필드가 있는 연속 행 중에서 NA
필드 수가 가장 적은 첫 번째 행을 인쇄합니다.
연속적이지 않은 경우 정렬을 사용할 수 있습니다.
< yourfile awk '{for (i=n=0;i<NF;i++) if ($i == "NA") n++; print n, $0}' |
sort -k5,5 -k1,1n |
sort -muk5,5 |
cut -d ' ' -f 2-
를 사용할 때 두 번째 호출에 해당 옵션을 추가 busybox
sort
해야 합니다 .-s
-m
답변2
다음을 시도해 볼 수 있습니다.
perl -pae '
last if eof;
my($M, $N) = ("@F[0..4]", $,.<>);
print,$_=$N,@F=split,redo if substr($N,0,length($M)) ne $M;
$_ = ($_, $N)[s/NA/NA/g > $N =~ s//NA/g];
' file
.
sed -Ee '
$!N
/^((\S+\s+){5}).*\n\1/!{P;D;}
h;s/.*/ & /
:a;s/ NA (.*\n.*) NA / \1 /;ta
/\n.* NA /bb
g;s/.*\n//;b
:b;g;s/\n.*//
' file
결과
India 07 1800 BAHRAICH 42273 +28.4 +26.7 NA 997.1 1 NA NA
India 07 1800 BALASORE 42895 +29.0 +26.8 NA 999.7 NA NA NA
India 07 1800 BANGALORE 43295 +23.0 +17.4 908.1 geopotential_of_850mb_=_492 Trace NA NA
India 07 1800 BAREILLY 42189 +28.4 +26.2 NA 997.4 Trace NA NA
India 07 1800 BARMER 42435 +35.6 +22.6 NA 997.6 NA NA NA
India 07 1800 BHOPAL_BAIRAGHAR 42667 +23.6 +23.3 942.7 1000.5 13 NA NA
India 07 1800 BHUBANESHWAR 42971 +28.0 +25.7 NA 1000.7 NA NA NA
India 07 1800 BHUJ-RUDRAMATA 42634 +29.6 +25.7 NA 999.5 NA NA NA
India 07 1800 BIKANER 42165 +33.8 +25.1 NA 994.0 NA NA NA
India 07 1800 BOMBAY_SANTACRUZ 43003 +29.0 +26.8 NA 1004.4 10 NA NA