当数据或某些数据可能丢失或存在时检查列中的数据?

当数据或某些数据可能丢失或存在时检查列中的数据?

我不确定这是否可能。

假设我有这样的专栏:

Team      Colour      Game      Rainfall      PlayerName  
XYZ       Blue        Cricket   Yes           Kapil

假设我需要搜索下面的任何数据,Game我可以使用 awk 来完成,例如:

  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

宽度 in 的FIELDWIDTHS组成如下:

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

您可以选择使用例如子字符串()。如果第一行包含没有重复的唯一名称,即不是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         
}

相关内容