拆分数据以空格分隔

时间:2015-10-22 20:02:24

标签: regex bash awk

假设我有一个名称和寄存器的数据集,如

John Wayne 1234
Paul Newman 2345 Wrong register. The correct register is 2233
John Fitzgerald Kennedy 3456
Marilyn Monroe 1212

所有行都是空格分隔的。我想在awk中使用一个(或两个)正则表达式,它给出了以下输出:

John Wayne
Paul Newman
John Fitzgerald Kennedy
Marilyn Monroe

1234
2233
3456
1212

我知道数据的格式非常非常糟糕,但是有谁知道如何帮助我?

5 个答案:

答案 0 :(得分:2)

grep可用于分别生成两个输出。见下面的测试:

$  cat f
John Wayne 1234
Paul Newman 2345 Wrong register. The correct register is 2233
John Fitzgerald Kennedy 3456
Marilyn Monroe 1212

输出I:

$  grep -o '^[^0-9]\+' f                                          
John Wayne 
Paul Newman 
John Fitzgerald Kennedy 
Marilyn Monroe

输出II:

$  grep -o '[0-9]\+$' f 
1234
2233
3456
1212

上面使用的正则表达式相对简单。使用相同的想法,如果你愿意,也可以使用sed或awk应用正则表达式。

答案 1 :(得分:1)

这种情况相当简单,因为数字在最后一个分隔符之后,所以我们会将最后一列视为我们不知道其内容如下:

awk '{print $NF}'

对于其余部分,我们将简单地匹配包括空格在内的所有字母,直到我们得到一个非字母字符(例如数字),然后我们将用null替换所有其余字母:

sed 's/\([A-z ]*\) .*/\1/g'

答案 2 :(得分:1)

您可以使用sed

sed 's/[[:blank:]]*[[:digit:]]\+.*$//' file
John Wayne
Paul Newman
John Fitzgerald Kennedy
Marilyn Monroe

sed 's/.*[[:blank:]]\([[:digit:]]\+\)$/\1/' file
1234
2233
3456
1212

答案 3 :(得分:1)

晚会,但这可以让你同时做两个工作:

#!/usr/bin/awk -f

    {
        nums = nums "\n" $NF
        split($0, a, " [0-9]{4}")
        names = names a[1] "\n"
    }

END {
        print names nums
    }

首先,它占据该行的最后一个字段并将其添加到数字列表中。然后它将该行拆分为任何4位数字,并将拆分前的部分添加到名称列表中。最后,它打印名称列表,后跟数字列表。

输出:

John Wayne
Paul Newman
John Fitzgerald Kennedy
Marilyn Monroe

1234
2233
3456
1212

如果需要考虑多余的空格,请通过管道cat -e清楚地说明可能发生的空格。

答案 4 :(得分:0)

awk允许您将字符集指定为字段分隔符。因此,如果您知道您的姓名后面始终跟着数字,则可以使用:

awk -F"[0-9]" '{print $1}' /tmp/x