【发布时间】:2014-01-29 12:06:52
【问题描述】:
我有一个文件如下
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|
请帮我解决一下 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|
请帮我解决一下 awk。
【问题讨论】:
您可以为此使用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|
定义输入和输出字段分隔符为|后,它会根据空格分割第一个字段。然后将行打印回来。
【讨论】:
Sed 给我:| ABc def|0|0|0| 1 | 2| 9| 第一行。
2930 在你的awk 中去了哪里;)
另一个awk
awk '{sub(/ /,"|")}1' file
ABc|def|0|0|0| 1 | 2| 9|
0|2930|0|0|0|0| 1 | 2| 9|
没有前导空格,这可以正常工作。
【讨论】:
您说要替换 first 列中的分隔符(空格->竖线)。
您的第一个列中可能没有空格,但在其他列中,有空格。在这种情况下,您不想对该行进行任何更改。同样在您的第一列中,可能会有更多空格,我想您希望将它们全部替换。所以我想不出一个更短的方法来解决这个问题。
awk -F'|' -v OFS="|" '{gsub(/ /,"|",$1)}7' file
【讨论】:
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|
【讨论】: