假设我有一个名称和寄存器的数据集,如
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
我知道数据的格式非常非常糟糕,但是有谁知道如何帮助我?
答案 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