2012-05-14 60 views
3

我有一個文件和一個符合的文件看起來像這樣拆分姓氏出到新行

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

我只是想找到與GIVEN開始anylines並找到最後一個空格字符(假設是最後一個名字),然後創建一個新行。

所以輸入=

FOO=Bar 
GIVEN=David Smith 
Baz=123 

輸出應該

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

這是據我可以得到:

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

在這裏看到演示http://regexr.com?30uh8

+0

你想在Perl中做到這一點? AWK? – Ansari

+0

+1樣本輸入,預期輸出和一些代碼。祝你好運。 – shellter

+0

我很高興在* inx上運行任何東西 – Daveo

回答

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; 

應該工作。如果輸入文件非常大,則根據需要修改以逐行讀取。

+0

感謝它運行良好,我正在通過這樣的多個文件運行它。 '找。 -type f -name \ *。txt | xargs perl -i -ple's/^(GIVEN \ =。+)\ s +(\ S +)$/$ 1 \ nLAST = $ 2 /'' – Daveo

+0

沒有必要逃脫「=」因爲它不在「髒打」中:\ | ()[{^ $ * +? 。 – gangabass

+0

爲什麼從一開始就讀取整個文件並建議稍後逐行修改它?剛開始那樣。這並不難,以後也不會造成問題。 –

1
awk ' /^GIVEN=/ {last=$NF; $NF=""; print; print "LAST=" last; next} 1' filename 
+0

這不會修改原始行。 – Vijay

+0

爲真。更新.. –

0
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 
+0

並非示例輸入中的所有名稱都只有2個單詞。 –

1

substrrindex運營商是專爲這個任務。所述rindex發現起始於字符串的右手側上的字符的第一次出現的位置,並且substr需要的位置和長度,插入的子字符串:

substr作品上$_,在由下式給出的位置開始rindex,替換下一個1字符與\nLAST=

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

當你看到這段代碼,你會發現它已經在的你需要一行代碼的形式,但是在這種情況下,我使用廣義引用以避免殼體插值問題:

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

但是,這可能會破壞一些人的名字。不是每一個姓氏都是一個單詞。詢問這個人是瞭解他們姓氏的唯一好方法。