【问题标题】:Split lastname out onto new line将姓氏拆分到新行
【发布时间】:2012-05-21 13:59:25
【问题描述】:

我有一个文件,文件中的一行是这样的

GIVEN=David Smith
GIVEN=John Doe Young
GIVEN=Ms Sam Parker
GIVEN=Mr James Free Foo ABC
GIVEN=Joe Cam-Barr

我只想找到以GIVEN 开头的任何行并找到最后一个空格字符(假设是姓氏)然后换行。

所以输入 =

FOO=Bar
GIVEN=David Smith
Baz=123

输出应该是

FOO=Bar
GIVEN=David
LAST=Smith
Baz=123

这是我所能得到的:

(?<=(GIVEN=))(.*\ )

见这里演示http://regexr.com?30uh8

【问题讨论】:

  • 您想在 Perl 中执行此操作吗?哇?
  • +1 用于示例输入、预期输出和一些代码。祝你好运。
  • 我很高兴在 *inx 上运行的任何东西
  • 任何尝试进行这种简单名称处理的人都会在某些时候惹恼某人。

标签: regex perl unix awk


【解决方案1】:
open(my $IN, "<infile.txt") or die $!;
chomp(my @lines = <$IN>);
close $IN;

foreach(@lines){
  s/^(GIVEN\=.+)\s+(\S+)$/$1\nLAST=$2/;
}

open(my $OUT,">outfile.txt") or die $!;
print "$_\n" foreach(@lines);
close $OUT;

应该可以。如果输入文件很大,则根据需要逐行读取。

【讨论】:

  • 感谢它运行良好,我正在像这样的多个文件上运行它。 find . -type f -name \*.txt |xargs perl -i -ple 's/^(GIVEN\=.+)\s+(\S+)$/$1\nLAST=$2/'
  • 没有必要转义“=”,因为它不在“脏打”中:\ | ( ) [ { ^ $ * + ? .
  • 为什么一开始就读整个文件,然后建议以后逐行修改呢?就这样开始吧。不难,以后也不会出问题。
【解决方案2】:
awk ' /^GIVEN=/ {last=$NF; $NF=""; print; print "LAST=" last; next} 1' filename

【讨论】:

  • 这不会修改原行。
【解决方案3】:

substrrindex 运算符专为此任务而设计。 rindex 查找从字符串右侧开始的字符第一次出现的位置,substr 采用位置和长度来插入子字符串:

这个substr 作用于$_,从rindex 给出的位置开始,用\nLAST= 替换下一个1 字符:

while( <> ) {
    substr( $_, rindex( $_, ' ' ), 1, "\nLAST=" ) if /\AGIVEN=/;
    print;
    }

当您查看此代码时,您会发现它已经是您需要的单行代码形式,尽管在这种情况下,我使用通用引用来避免 shell 插值问题:

% perl -pi.old -e 'substr($_,rindex($_,q( )),1,qq(\nLAST=)) if /\AGIVEN=/' ...

但是,这可能会破坏某些人的姓名。不是每个姓氏都是一个词。询问对方是了解其姓氏的唯一好方法。

【讨论】:

    【解决方案4】:
    thames.434> cat file
        FOO=Bar
        GIVEN=David Smith
        Baz=123
    
    thames.435> awk '{if ($0~/GIVEN/){x=$2;$2="";print;print "LAST=",x}else print}' file
        FOO=Bar
    GIVEN=David 
    LAST= Smith
        Baz=123
    

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多