2012-05-12 44 views
-4

我是一名語言學家(試圖對拉丁語進行一些數據挖掘),但是對於編程來說卻是一種新興的東西。查找,複製和替換正則表達式或其他?

我有一個文件構成是這樣的:

cerycium:cerycia 
cessatio:cessatio 
    cessatione 
cessicius:cessicia 
cessio:cessio 
    cessione 
    cessionem 
    cessioni 

,我需要它安排是這樣的:

cerycium:cerycia 
cessatio:cessatio 
cessatio:cessatione 
cessicius:cessicia 
cessio:cessio 
cessio:cessione 
cessio:cessionem 
cessio:cessioni 

誰能好心提供了一個素文字(bash中,正則表達式,蟒蛇,等等)是可能爲我做這個?謝謝!

+1

是由空格或製表符所做的縮進?整個過程是否一致? – DerfK

+5

[Stack Overflow不是您的個人研究助理](http://meta.stackexchange.com/a/128553)。你至少需要在解決自己的問題方面作出一些努力。 –

回答

0

蟒蛇:如果第一行有兩個字段

with open('in.txt') as f: 
    lines=f.readlines() 
for i,x in enumerate(lines): 
    if ':' in x: 
     lines[i]=x.strip() 
    else: 
     lines[i]=lines[i-1].split(':')[0]+':'+x.strip() 

print("\n".join(lines)) 

輸出:

cerycium:cerycia 
    cessatio:cessatio 
    cessatio:cessatione 
    cessicius:cessicia 
    cessio:cessio 
    cessio:cessione 
    cessio:cessionem 
    cessio:cessioni 
1
awk 'BEGIN {FS = OFS = ":"} NF == 1 {gsub(/[[:space:]]/, ""); $2 = $1; $1 = root} {root = $1; print}' inputfile 

即假設第一行有兩個字段。

0

嘗試在perl:文件名:process.pl

#!/bin/perl 

use strict; 
use warnings; 

open (READ_FILE, "infile"); 
my @fcontent = <READ_FILE>; 
close (READ_FILE); 

our $prefix = ""; 
foreach(@fcontent) { 
    if(grep(/:/, $_)) { 
     my @tokens = split(":", $_); 
     $prefix = $tokens[0]; 
    } else { 
     $_ =~ s/\s+//; 
     $_= "$prefix:$_"; 
    } 
    print $_; 
} 

open (WRITE_FILE, ">outfile"); 
foreach(@fcontent) { 
    print WRITE_FILE $_; 
} 
close (WRITE_FILE); 

在命令提示符:

perl process.pl 

然後打開OUTFILE看到的結果.. 我已經簡化了程序,主要是爲了更好的可讀性,你可以隨意編輯。

1

簡化丹尼斯腳本的版本:

awk -F: 'NF==2 {root=$1; print $1":"$2;} NF==1 {gsub(/\s+/,""); print root":"$1;}' a.txt 

或匹配,而不是計數:

awk -F: '/:/ {root=$1; print $1":"$2;} /^\s+/ {gsub(/\s+/,"");print root":"$1;}' a.txt