データまたは一部のデータが欠落しているか存在する可能性がある場合は、列のデータを確認しますか?

データまたは一部のデータが欠落しているか存在する可能性がある場合は、列のデータを確認しますか?

これが可能かどうかはわかりません。

次のような熱があるとしましょう。

Team      Colour      Game      Rainfall      PlayerName  
XYZ       Blue        Cricket   Yes           Kapil

以下のデータを検索する必要があると仮定すると、Gameawkを使用して検索できます。たとえば、次のようになります。

  awk '{for(i=1;i<NF;i++)
        {
         if($i == "Game")
          {
          GameData=i
          next
          }
        if( i == GameData )
          {
          print "Column below Game is" $i
          }
        }
      }'

しかし、一部の列の値が欠落している可能性があるかどうかわからない場合はどうすればよいですか?

XYZ       Blue     

存在しないか、どちらも存在しないか、存在することができます。

編集するTチームの最初の文字(最初の列)は常に先頭にあり、C色の最初の文字は常に最初から10文字の後にあり、Gゲームの最初の文字は常に最初から20文字の後にあるとします。 。など。

答え1

この情報を回復する良い方法が実際にあるかどうかはわかりません。間のフィールドが空で区切り文字に不特定数の文字が含まれるようにした場合、表示されるフィールドがはいであることをどのように知ることができますか?またはColourいいえPlayerName

ある時点では、データを特定の方法でフォーマットする必要があります。できるプログラムで解析すると、他のすべては過酷なデータフィードの結果にすぎません。任意のフィールドを省略するには、単一文字区切り文字に切り替える必要があります。

これが可読性の問題の場合は、フィールドを含むデータプレゼンテーションを作成できます。はい正しい列の下に来るまで空白を埋めます。しかし、そうすると、実際に見ているフィールドを知ることができる情報が破壊されるため、一方向プロセスです。

答え2

awk -v field="Game" -v FIELDWIDTHS="10 12 10 13 25" '
  NR == 1 {cmpstr="^" field " *$";
    for (i=0;i<6;i++) if ($i ~ cmpstr) { fieldindex=i; next;}; exit 1};
  {gsub(" ","",$fieldindex); if ($fieldindex != "") print $fieldindex;}' inputfile

編集1:一致する列がない場合は、エラーコードで終了します。

編集2:空行を出力しないでください。

答え3

FIELDWIDTHS拡張機能gawkであり、移植性はありませんが、これを使用できます。次のようにフィールド名を指定することもできます。

awk '
BEGIN {
    FIELDWIDTHS = "10 9 13 11 32"
    team=1; colour=2; game=3; rainfall=4; name=5;
}

NR == 1 {
    next
}
/./ {
    print $3, $name
} ' fixwdata

幅の構成はFIELDWIDTHS次のとおりです。

  Team      Colour   Game      Rainfall   PlayerName  
  XYZ       Blue     Cricket   Yes        Kapil
# <-  10  -><-  9  -><-  10  -><-  11   -><-     NN      ->  FIELDWIDTHS
#     $1        $2       $3        $4            $5          Field numbers

たとえば、次を使用することを選択できます。部分文字列()。最初の行に重複しない一意の名前が含まれている場合(例:not)をName使用TeamNameできますindex()

これは少し脆弱に見えますね。データが固定幅の場合はハードコードできますが、一部のプログラムでは固定幅を出力することがあります。しかし、また、データ幅に基づいてデータをソートします。したがって、次のようになります。

出力1:

FLD1 FLD2
foo  bar

出力2:

FLD1   FLD2
foobaz bar

この例では、他の名前と重複する名前がないと仮定します。

awk '
function get_fld(fld_name)
{
    return substr($0, col[fld_name"s"], col[fld_name"w"]);
}
BEGIN {
    team=1
    colour=2
    game=3
    rainfall=4
    name=5
}
NR == 1 {
    col["1s"]=0
    col["2s"]=index($0, $2)
    col["3s"]=index($0, $3)
    col["4s"]=index($0, $4)
    col["5s"]=index($0, $5)
    col["1w"]=col["2s"] - 1
    col["2w"]=col["3s"] - col["2s"]
    col["3w"]=col["4s"] - col["3s"]
    col["4w"]=col["5s"] - col["4s"]
    col["5w"]=22
    next
}
/./ {
    printf(\
    "%-5s {\n"\
    "%12s: %s\n"\
    "%12s: %s\n"\
    "%12s: %s\n"\
    "%12s: %s\n"\
    "}\n",
    get_fld(name),
    "Team", get_fld(team),
    "Colour", get_fld(colour),
    "Game", get_fld(game),
    "Rainfall", get_fld(rainfall));
} ' fixwdata

入力する:

Team      Colour   Game         Rainfall   PlayerName  
ABC       Blue     Cricket      Yes        Kapil
DEF       Red      Cricket                 Konos
DEF       Yellow   Go                      Kripl
DUX       Black
Zon       Purple   Golf         No         Gim
Zon       Purple   Golf         No         Jom

出力:

Kapil {
        Team: ABC       
      Colour: Blue     
        Game: Cricket      
    Rainfall: Yes        
}
Konos {
        Team: DEF       
      Colour: Red      
        Game: Cricket      
    Rainfall:            
}
Kripl {
        Team: DEF       
      Colour: Yellow   
        Game: Go           
    Rainfall:            
}
      {
        Team: DUX       
      Colour: Black
        Game: 
    Rainfall: 
}
Gim   {
        Team: Zon       
      Colour: Purple   
        Game: Golf         
    Rainfall: No         
}
Jom   {
        Team: Zon       
      Colour: Purple   
        Game: Golf         
    Rainfall: No         
}

関連情報