linux - 如何使用 sed 转换不均匀的制表符分隔文件?

标签 linux bash awk sed

如何使用 sed 命令将不均匀的 TAB 分隔输入文件转换为 CSV 或 PSV?

28828082-1      04/08/19 08:48  04/11/19 12:37  04/12/19 16:22  4/15-4/16       04/17/19        2       9       LCO     W                       OIP     04/08/19 08:53 21       1       58.00           9       222     79      FEDX    FEDXH   SL3     484657064673    0410099900691041119             SMITHFIELD      RI      02917   "41.890066 , -71.548680"        YES

上面是 1 行,我尝试使用 sed -r 's/^\s+//;s/\s+/|/g' 但结果不符合预期。

最佳答案

gawk来救援!

$ awk -vFPAT='([^[:space:]]+)|("[^"]+")' -v OFS='|' '$1=$1' file

28828082-1|04/08/19|08:48|04/11/19|12:37|04/12/19|16:22|4/15-4/16|04/17/19|2|9|LCO|W|OIP|04/08/19|08:53|21|1|58.00|9|222|79|FEDX|FEDXH|SL3|484657064673|0410099900691041119|SMITHFIELD|RI|02917|"41.890066 , -71.548680"|YES

将字段模式定义为非空格或带引号的值,其中可能包含空格(但不包含转义引号),替换用制表符分隔的输出字段,强制解析行,并且在格式更改后将打印非零行。

更好的版本是 ... '{$1=$1;打印}'

当然,如果所有字段分隔符都是制表符并且引号字符串不包含任何制表符,那就简单多了。

关于linux - 如何使用 sed 转换不均匀的制表符分隔文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934724/

相关文章:

linux - 如何从已安装的 RPM 中获取许可证列表?

linux - 内核中的 sk_buffs 数量是否有限制

regex - 使用 Sed 和正则表达式替换字符串

Bash - 使用临时文件夹中的文件

linux - 在 grep 匹配模式输出行前面打印文件名

linux - awk 中嵌套的 BEGIN-END block

linux - 我可以让 Mac、Windows 和 linux 共享一个 git 存储库而不用担心行结束吗?

linux - 在 bash linux 中为 linux 中的多媒体文件(不是图像)编辑元数据

linux - $ 可以用作 BASH 中的连接符号吗?

linux - 打印和排序输出的替代方法