使用awk添加选项卡时遇到的问题

kuuvgm7e  于 2021-06-21  发布在  Pig
关注(0)|答案(3)|浏览(509)

样品记录

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

因为它是采取'被绊倒'为多个领域,请建议。

py49o6xq

py49o6xq1#

@詹姆斯布朗的回答听起来像你要求的,但也考虑到:

$ 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+个空格的每个序列转换为一个tab,因此结果是一个tab分隔的流 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"

如果您的输入字段不总是由至少两个空格字符分隔,那么请告诉我们它们是如何分隔的。

falq053o

falq053o2#

如果在标题文本后只需要一个选项卡 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就不会重建记录并替换 FSOFS 等。

unhi4e5o

unhi4e5o3#

尝试使用

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

问题是awk(默认情况下)将单个空格视为两列之间的分隔符。这意味着 Got Stucked 实际上是两个不同的列。
-F' ' 告诉awk使用双空格作为分隔符来区分两列。

相关问题