如何在shell中的两列之间插入不同的分隔符

时间:2014-01-29 12:06:52

标签: shell sed awk

我有一个文件如下

ABc def|0|0|0| 1 | 2| 9|
0 2930|0|0|0|0| 1 | 2| 9|

现在,我想用相同的分隔符拆分第一列。

输出:

ABc|def|0|0|0| 1 | 2| 9|
0|2930|0|0|0|0| 1 | 2| 9|

请帮我解决问题。

4 个答案:

答案 0 :(得分:2)

您可以使用sed

$ sed 's/ /|/' file
ABc|def|0|0|0| 1 | 2| 9|
0|2930|0|0|0|0| 1 | 2| 9|

定义它的方式,它只是用|替换第一个空格,这正是你需要的。

awk有点长:

$ $ awk 'BEGIN{FS=OFS="|"}{split($1, a, " "); $1=a[1]"|"a[2]}1' file
ABc|def|0|0|0| 1 | 2| 9|
0|2930|0|0|0|0| 1 | 2| 9|

将输入和输出字段分隔符定义为|后,它会根据空格分割第一个字段。然后打印回来。

答案 1 :(得分:1)

另一个awk

awk '{sub(/ /,"|")}1' file
ABc|def|0|0|0| 1 | 2| 9|
0|2930|0|0|0|0| 1 | 2| 9|

没有领先的空间,这很好。

答案 2 :(得分:0)

您说要在第一个列中替换分隔符(space-> pipe)。

可能会发生在你的第一个col中,没有空间,但在其他列中,有空格。在这种情况下,您不希望在该行上进行任何更改。同样在你的第一列中,可能会有更多空格,我想你想要将它们全部替换掉​​。所以我想不出更短的方法来解决这个问题。

awk -F'|' -v OFS="|" '{gsub(/ /,"|",$1)}7' file

答案 3 :(得分:-1)

sed 's/^[[:blank:]]\{1,\}/  /;/^\([^|]\{1,\}\)[[:blank:]]\{1,\}\([^|[[:blank:]]\)/ s//\1|\2/'

假设第一列为空,空白(或几个)作为分隔符,而不是另一个非空白或| 这允许这个

ABc def|0|0|0| 1 | 2| 9|
 def|0|0|0| 1 | 2| 9|
ABc|def|0|0|0| 1 | 2| 9|