Csv 没有固定宽度的分区文本

Csv 没有固定宽度的分区文本,csv,text,awk,Csv,Text,Awk,我有一些这样的文字 blue chile green morning dawn red turkey pink morning dawn white south africa red evening midst & more 我想这样分割它(注意管道分隔符) 没有固定的宽度,因此无法对文本进行分区这可能就是您要查找的内容: $ sed -E 's/ {3,}/ | /; s/ */ /g' file

我有一些这样的文字

blue chile               green   morning dawn
red  turkey              pink    morning dawn
white south africa       red     evening midst & more
我想这样分割它(注意管道分隔符)


没有固定的宽度,因此无法对文本进行分区这可能就是您要查找的内容:

$ 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个或3个以上的空白字符分隔,就像您发布的示例输入一样。它将在GNU或OSX sed for
-E
中工作,以启用ERE

否则,如果字段确实是固定宽度,如在您的张贴输入中出现的,那么为了提高鲁棒性,考虑使用GNUAWK字段宽度:

$ 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

这可能是您正在寻找的:

$ 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个或3个以上的空白字符分隔,就像您发布的示例输入一样。它将在GNU或OSX sed for
-E
中工作,以启用ERE

否则,如果字段确实是固定宽度,如在您的张贴输入中出现的,那么为了提高鲁棒性,考虑使用GNUAWK字段宽度:

$ 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

如果要规范化除管道分隔符之外的空间

blue child | green morning dawn
red turkey | pink morning dawn
white south africa | red evening midst & more
$ 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

这与您的输出相匹配,但请注意,
红色土耳其
中的额外空间也被删除。如果要保留它,则需要额外的步骤。

如果要在管道分隔符之外规范化空格

blue child | green morning dawn
red turkey | pink morning dawn
white south africa | red evening midst & more
$ 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

这与您的输出相匹配,但请注意,
红色土耳其
中的额外空间也被删除。如果你想保存它,需要额外的步骤。

我觉得它们的宽度是固定的。你为什么说它们不是?是的,它们是固定宽度的!刚刚意识到我看他们是固定宽度的。你为什么说它们不是?是的,它们是固定宽度的!只是意识到我不知道字段宽度。那么,可以用列号25、55和67进行分区吗?是的,随便你喜欢什么。。。看见对于其他AWK,您将使用
while()substr()
循环。感谢substr和fieldwidths提示,我不知道fieldwidths。那么,可以用列号25、55和67进行分区吗?是的,随便你喜欢什么。。。看见对于其他AWK,您可以使用
while()substr()
循环。感谢substr和fieldwidths提示