代码之家  ›  专栏  ›  技术社区  ›  Fin

如何使用bash从表中提取数据

  •  -3
  • Fin  · 技术社区  · 7 月前

    嗨,我想从cli中提取输出第一列中的元素,如下所示:

                 Title
    ----------------------------------
    | Column A | Column B | Column C |
    | -------- | -------- | -------- |
      > Cell 1   Cell2      Cell5    
      Cell 3     Cell4      Cell6    
    

    我希望从第一列中提取所有元素。 这张桌子的独特之处:

    • 第一列中只有一个元素可以具有“>”字符后跟空格和名称。
    • 第一列中的名称可以包含空格
    • 第2列或第3列中的元素没有空格

    例如

                 Title
    ----------------------------------
    | Names    | ID       | Sales    |
    | -------- | -------- | -------- |
      > Fin Bo   192019     10       
      QuarGem    12982      1        
    

    我想要 > Fin Bo QuarGem

    我可以使用sed、awk、grep和其他linux工具,目前尝试了以下方法:

    cat ./table | tail -n +5 | awk '{print $1}' 但它没有给出正确的结果,而是给出了以下内容:

    >
    W-44XA45
    Flint
    

    对于输入:

                                        Title
    --------------------------------------------------------------------------------
          name                               id                  sales
    --------------------------------------------------------------------------------
      >   quantum                            pki                 10
          W-44XA45                           aks                 1
          Flint GD                           ixs                 2
    
    3 回复  |  直到 7 月前
        1
  •  0
  •   Ed Morton    7 月前

    使用任何POSIX awk并保留第一个字段内的空白:

    $ awk 'NR>4{ gsub(/^[[:space:]]+|([[:space:]]+[^[:space:]]+){2}$/,""); print }' file
    >   quantum
    W-44XA45
    Flint GD
    

    或者,如果你不关心保留空白,而是使用awk进行更改 NF 更改字段数量,例如GNU awk:

    $ awk 'NR>4{ NF-=2; print }' file
    > quantum
    W-44XA45
    Flint GD
    
        2
  •  0
  •   choroba    7 月前

    如果你能使用Perl,以下方法应该有效:

    perl -lane 'print "@F[0..$#F-2]" if $. > 4' -- filename
    
    • -n 逐行读取输入;
    • -a 将每一行拆分为@F数组;
    • -l 从输入中删除新行并将其添加到 print ed线;
    • $#F 是最后一个元素的索引, $#F-2 对应于右侧的第二个元素;
    • $. 是当前行号。
        3
  •  0
  •   Daweo    7 月前

    这个

                 Title
    ----------------------------------
    | Names    | ID       | Sales    |
    | -------- | -------- | -------- |
      > Fin Bo   192019     10       
      QuarGem    12982      1        
    

    是固定宽度格式的示例,GNU AWK feature 用于处理此类文件。在这种特殊情况下,假设下面有空格 | 确实属于右侧的字段,宽度为11,11,11,因此GNU AWK 假设文件名为 table 然后

    awk 'BEGIN{FIELDWIDTHS="11 11 11"}NR>=5{print $1}' table
    

    给出输出

      > Fin Bo 
      QuarGem  
    

    说明:我通知GNU AWK 关于第5行及以下I的字段宽度 print 第一个字段的内容。

    (在GNU Awk 5.3.1中测试)