데이터 또는 일부 데이터가 누락되거나 존재할 수 있는 경우 열의 데이터를 확인하시겠습니까?

데이터 또는 일부 데이터가 누락되거나 존재할 수 있는 경우 열의 데이터를 확인하시겠습니까?

이것이 가능한지 잘 모르겠습니다.

다음과 같은 열이 있다고 가정해 보겠습니다.

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         
}

관련 정보