【问题标题】:Getting Issues In Adding A Tab Using AWK在使用 AWK 添加选项卡时遇到问题
【发布时间】:2016-11-15 13:10:44
【问题描述】:

示例日志

Location        Number  Status  Comment
Delhi           919xxx  Processed       Test File 1
Mumbai          918xxx  Got Stucked     Test File 123

我正在尝试使用 AWK 在 Status 之后添加一个选项卡空间,但出现错误。

示例查询

awk '{$3 = $3 "\t"; print}' z

输出为

Location Number Status   Comment
Delhi 919xxx Processed   Test File 1
Mumbai 918xxx **Got**        **Stucked** Test File 123

由于将“被卡住”作为多个字段,请提出建议。

【问题讨论】:

  • 我可能在编辑过程中更改了输入文件;但如果字段之间有 2+ 个字符分隔符,那么您可以使用一些 sed,而不是 awk
  • 脚本如何判断Got Stucked 中的空格是字段的一部分,而不是字段之间的分隔符?您的字段实际上是由制表符分隔的,还是您的字段是固定宽度或其他?

标签: linux awk sed apache-pig bigdata


【解决方案1】:

如果您只想在标题文本Status 之后添加一个制表符以使其看起来更好,请仅对第一条记录使用sub:

$ awk 'NR==1 {sub(/Status/,"Status\t")} 1' file
Location        Number  Status              Comment
Delhi           919xxx  Processed           Test File 1
Mumbai          918xxx  Got Stucked         Test File 123

这种方式 awk 不会重建记录并将 FS 替换为 OFS 等。

【讨论】:

    【解决方案2】:

    @JamesBrown 的回答听起来像您要求的,但也要考虑:

    $ awk -F'  +' -v OFS='\t' '{$1=$1}1' file | column -s$'\t' -t
    Location  Number  Status       Comment
    Delhi     919xxx  Processed    Test File 1
    Mumbai    918xxx  Got Stucked  Test File 123
    

    awk 将 2+ 个空格的每个序列转换为一个制表符,因此结果是一个制表符分隔的流,column 如果这是您的最终目标,然后可以将其转换为视觉对齐的表格。或者您可以生成一个 CSV 以读取 Excel 或类似文件:

    $ awk -F'  +' -v OFS=',' '{$1=$1}1' file
    Location,Number,Status,Comment
    Delhi,919xxx,Processed,Test File 1
    Mumbai,918xxx,Got Stucked,Test File 123
    
    $ awk -F'  +' -v OFS=',' '{for(i=1;i<=NF;i++) $i="\""$i"\""}1' file
    "Location","Number","Status","Comment"
    "Delhi","919xxx","Processed","Test File 1"
    "Mumbai","918xxx","Got Stucked","Test File 123"
    

    或更稳健:

    $ awk -F'  +' -v OFS=',' '{$1=$1; for(i=1;i<=NF;i++) { gsub(/"/,"\"\"",$i); if ($i~/[[:space:],"]/) $i="\""$i"\"" } }1' file
    Location,Number,Status,Comment
    Delhi,919xxx,Processed,"Test File 1"
    Mumbai,918xxx,"Got Stucked","Test File 123"
    

    如果您的输入字段并非总是由至少 2 个空白字符分隔,请告诉我们它们是如何分隔的。

    【讨论】:

    • 应该是 2+ 个空格或制表符。
    • 可能是,在这种情况下-F'[[:space:]]{2,}|\t'。也可能是固定宽度输入,idk。我希望得到 OP 的一些回应。
    【解决方案3】:

    尝试使用

    awk -F'  ' '{$3 = $3 "\t"; print}' z
    

    问题是 awk 考虑(默认情况下)单个空格作为两列之间的分隔符。这意味着Got Stucked 实际上是两个不同的列。

    -F' ' 告诉 awk 使用双空格作为分隔符来区分两列。

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2017-10-09
      • 2023-02-09
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多