删除特定单词数量较多的行

删除特定单词数量较多的行

我有一个大文件,如下所示:

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

相关内容