[英]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.