分区文本没有固定宽度

时间:2017-05-12 16:38:07

标签: csv text awk

我有一些这样的文字

blue chile               green   morning dawn
red  turkey              pink    morning dawn
white south africa       red     evening midst & more

我想像这样拆分它(注意管道定界符)

blue child | green morning dawn
red turkey | pink morning dawn
white south africa | red evening midst & more

没有固定宽度,所以我在分区文本时遇到问题

2 个答案:

答案 0 :(得分:3)

这可能是你正在寻找的东西:

$ sed -E 's/ {3,}/ | /; s/  */ /g' file
blue chile | green morning dawn
red turkey | pink morning dawn
white south africa | red evening midst & more

以上假设您的2"字段"由您发布的示例输入中的3个或更多空白字符分隔。它将在GNU或OSX sed中用于-E以启用ERE。

否则,如果字段确实是固定宽度,因为它显示在您发布的输入中,那么为了提高稳健性,请考虑使用GNU awk进行FIELDWIDTHS:

$ awk -v FIELDWIDTHS='25 8 999' -v OFS=' | ' '{print $1, $2, $3}' file
blue chile                | green    | morning dawn
red  turkey               | pink     | morning dawn
white south africa        | red      | evening midst & more

$ awk -v FIELDWIDTHS='25 8 999' -v OFS=' | ' '{print $1, $2 $3}' file
blue chile                | green   morning dawn
red  turkey               | pink    morning dawn
white south africa        | red     evening midst & more

$ awk -v FIELDWIDTHS='25 8 999' -v OFS=' | ' '{$0 = $1 OFS $2 $3; gsub(/ +/," ")} 1' file
blue chile | green morning dawn
red turkey | pink morning dawn
white south africa | red evening midst & more

答案 1 :(得分:1)

如果除了管道分隔符

之外还想标准化空格
$ sed -r 's/(.{25})/\1 | /' file | tr -s ' '

blue chile | green morning dawn
red turkey | pink morning dawn
white south africa | red evening midst & more

这符合您的输出,但请注意red turkey中的额外空格也会被删除。如果您想保留它,则需要额外的步骤。