1

我有以下数据,尽我所能,但没有成功......

Las Vegas Nevada 89102|US|Katrina Roetteler
zhen fo shan guang dong 528318|CN|tu min jung
Zurich  CH8022|CH|Kevin M Pearl
Cheltenham GL52 8XX|UK|Kevin M Pearl
Melbourne Vic 3000|AU|brent chandler
Bratislava  821 03|Slovak Republic|SUSTRIK MARTIN MGR.
Zurich 8032|CH|David Graf
Tokyo 178-0063|JP|takahiro ichihashi

我需要像这样改变它:

Las Vegas Nevada|89102|US|Katrina Roetteler
zhen fo shan guang dong|528318|CN|tu min jung
Zurich |CH8022|CH|Kevin M Pearl
Cheltenham|GL52 8XX|UK|Kevin M Pearl
Melbourne Vic|3000|AU|brent chandler
Bratislava |821 03|Slovak Republic|SUSTRIK MARTIN MGR.
Zurich|8032|CH|David Graf
Tokyo|178-0063|JP|takahiro ichihashi

基本上将邮政编码/邮政编码放在另一列(我的全球客户的不同类型的邮政编码),邮政编码/邮政编码在第一个垂直条之前。

谢谢!

4

3 回答 3

3

使用 sed:

sed 's/^\([A-Za-z ]*\) \([-A-Z 0-9]*|\)/\1|\2/' input

输出

Las Vegas Nevada|89102|US|Katrina Roetteler
zhen fo shan guang dong|528318|CN|tu min jung
Zurich |CH8022|CH|Kevin M Pearl
Cheltenham|GL52 8XX|UK|Kevin M Pearl
Melbourne Vic|3000|AU|brent chandler
Bratislava |821 03|Slovak Republic|SUSTRIK MARTIN MGR.
Zurich|8032|CH|David Graf
Tokyo|178-0063|JP|takahiro ichihashi
于 2013-04-24T20:48:18.823 回答
1

以下正则表达式执行此操作:

sed 's/ \([A-Z]*[0-9][0-9]*\)/\|\1/'
于 2013-04-24T20:53:23.833 回答
1

让你开始使用 awk 的一些东西:

{
    for (i = 1; i < NF; i++) {
        if ($i~/\|/) {
            if ($(i-1)~/[0-9]/) {
                $(i-1) = "|"$(i-1)
            } else {
            $i = "|"$i
            }
            break
        }
    }
}
{print}

输出:

Las Vegas Nevada |89102|US|Katrina Roetteler
zhen fo shan guang dong |528318|CN|tu min jung
Zurich |CH8022|CH|Kevin M Pearl
Cheltenham |GL52 8XX|UK|Kevin M Pearl
Melbourne Vic |3000|AU|brent chandler
Bratislava |821 03|Slovak Republic|SUSTRIK MARTIN MGR.
Zurich |8032|CH|David Graf
Tokyo |178-0063|JP|takahiro ichihashi
于 2013-04-24T21:03:28.587 回答