在使用 AWK 添加选项卡时遇到问题

Posted

技术标签:

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

示例日志

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

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

示例查询

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 中的空格是字段的一部分,而不是字段之间的分隔符?您的字段实际上是由制表符分隔的,还是您的字段是固定宽度或其他? 【参考方案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=$11' 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=$11' 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 使用双空格作为分隔符来区分两列。

【讨论】:

以上是关于在使用 AWK 添加选项卡时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

重新打开选项卡时返回视图层次结构中的初始 ViewController

在视图中动态添加 jquery 选项卡

当添加子选项卡时,如何使 qtabwidget 实例自动调整大小?

Visual Studio 代码中的 JUnit

awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址

带有一个选项卡的 QTabBar 太宽