繁体   English   中英

用空格分隔数据

[英]Split data separated by spaces

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

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

我知道数据的格式非常非常糟糕,但是有人知道如何为我提供帮助吗?

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

输出二:

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

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

这种情况非常简单,因为数字在最后一个分隔符之后,所以我们将最后一列当作未意识到其内容,如下所示:

awk '{print $NF}'

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

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

您可以使用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

晚会晚了,但这可以让您一次完成两项工作:

#!/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以便非常清楚可能在哪里发生了空白。

使用awk,您可以将字符集指定为字段分隔符。 因此,如果您知道自己的名字后总是跟数字,则可以使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM