AWK ::如何将两列内容合并为一列

时间:2014-12-08 11:59:53

标签: regex awk sed

我的示例文字:

我有一个文件,其中包含以下行(示例)。

Manolito                     Mapi
MapleStory                   MEEBO
MEEBO_audio                  MEEBO_unknown
MEEBO_video                  MGCP
MGCP_control                 MGCP_rtp
Microsoft\ Exchange          Microsoft\ Exchange_generic
Mig33                        MMS
Mojo                         Move
MPEG                         MPlus

我想删除单词之间的空格,然后我想输出为:

Manolito
Mapi
MapleStory
MEEBO
MEEBO_audio
MEEBO_unknown
MEEBO_video
MGCP
MGCP_control
MGCP_rtp
Microsoft\ Exchange
Microsoft\ Exchange_generic
Mig33
MMS
Mojo
Move
MPEG
MPlus

请注意,每个单词后都不应有任何训练空间。

请建议我使用任何awk或其他编程脚本来实现此目的。

谢谢,

库马尔

5 个答案:

答案 0 :(得分:4)

有些人喜欢这样:

awk -F"  +"  '{print $1 RS $2}' file
Manolito
Mapi
MapleStory
MEEBO
MEEBO_audio
MEEBO_unknown
MEEBO_video
MGCP
MGCP_control
MGCP_rtp
Microsoft\ Exchange
Microsoft\ Exchange_generic
Mig33
MMS
Mojo
Move
MPEG
MPlus

将字段分隔符FS设置为两个或多个空格。然后打印出字段1换行字段2


PS这部分不起作用,它吃一个字符......
如果你不分割的空间被转义,那么这应该是:

awk -F'[^\\\\] +'  '{print $1"\n"$2}' file
Manolit
Mapi
MapleStor
MEEBO
MEEBO_audi
MEEBO_unknown
MEEBO_vide
MGCP
MGCP_contro
MGCP_rtp
Microsoft\ Exchang
Microsoft\ Exchange_generic
Mig3
MMS
Moj
Move
MPE
MPlus

或者如果可能还有标签:

awk -F'[^\\\\][ \t]+'  '{print $1"\n"$2}' file

答案 1 :(得分:2)

我假设您尝试用换行符替换两个或多个空格。如果是,那么你可以使用下面的sed命令。

$ sed 's/[[:space:]]\{2,\}/\n/g' file
Manolito
Mapi
MapleStory
MEEBO
MEEBO_audio
MEEBO_unknown
MEEBO_video
MGCP
MGCP_control
MGCP_rtp
Microsoft\ Exchange
Microsoft\ Exchange_generic
Mig33
MMS
Mojo
Move
MPEG
MPlus

[[:space:]]\{2,\}匹配两个或多个空格。用换行符替换那些匹配的空格将为您提供所需的输出。

答案 2 :(得分:2)

在Python中:

import re
with open("in.txt","r") as infile, open("out.txt", "w") as outfile:
    for line in infile.readlines():
        outfile.write('\n'.join(re.split("[^\\\\]\s+",line)))

答案 3 :(得分:1)

使用grep -oP即可:

grep -oP '\w.*?\w(?= |$)' file
Manolito
Mapi
MapleStory
MEEBO
MEEBO_audio
MEEBO_unknown
MEEBO_video
MGCP
MGCP_control
MGCP_rtp
Microsoft\ Exchange
Microsoft\ Exchange_generic
Mig33
MMS
Mojo
Move
MPEG
MPlus

答案 4 :(得分:1)

另一种awk方式可以使用任意数量的字段,只要您不希望更改为换行符的空格就不需要多个空格。

awk -vORS= '{for(i=1;i<=NF;i++)print $i ($i~/\\$/?" ":"\n")}' file

或者

awk -vRS=" +"  'ORS=/\\/?" ":"\n"' file

输出

Manolito
Mapi
MapleStory
MEEBO
MEEBO_audio
MEEBO_unknown
MEEBO_video
MGCP
MGCP_control
MGCP_rtp
Microsoft\ Exchange
Microsoft\ Exchange_generic
Mig33
MMS
Mojo
Move
MPEG
MPlus