多行的自动增量编号为空白

时间:2012-08-15 05:29:47

标签: python regex sed awk

我有一个像这样的文件

apple

ae-pal

noun.

a fruit

ball

b'al

noun.

playing material
round shaped

等等。所以它从单词开始然后是一个空行和发音(我知道上面的那些是愚蠢的:P)。然后是词性和意义。每个学期后都有空行。 我最终想要的是做一个递归调用,这样它就可以将第一个单词放在数据库中的一个表中(mysql,可能是),然后放入同一个表的相应行中,依此类推。

首先,我想对这个空间进行编号。喜欢1 2 3 4等。所以我可以把所有1,5 * 9的2 * x + 1放在一个地方,将2 * x放在另一个地方,这样我就可以达到我的目的,我可以将它们推入数据库,最后得到我的字典。

我可以找到一种用数字替换空行的方法,但无法知道如何使它们增加数字。我想知道如何使用sed,awk甚至python实现这一点。毫无疑问,正则表达式会在那里。

伪代码

is line empty ? 
   yes ? give a number  x (x =1)
   increase x by 1
   no ? go to next line
   repeat till eof.

我希望我足够清楚!

4 个答案:

答案 0 :(得分:2)

这可能对您有用:

awk '/^$/{print ++c;next};1' file

或GNU sed:

touch /tmp/c
addone () { c=$(</tmp/c); ((c+=1)); echo $c | tee /tmp/c; }
export -f addone
sed '/^$/s//addone/e' file
rm /tmp/c

另一种方法可能是将所有空行变为制表符,将每第四个制表符变为换行符。

sed ':a;$!{N;ba};s/\n\n/\t/g;y/\n/ /;' file | sed 's/\t/\n/4;P;D'

答案 1 :(得分:1)

(line for line in open(...) if line)

是对文件的非空行的可迭代。使用this recipe以四肢迭代:

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return izip_longest(*args, fillvalue=fillvalue)

nonempty_lines = (line for line in open(...) if line)
grouper(nonempty_lines, 4)

答案 2 :(得分:1)

您可以使用iterable,因为它仅在调用next()时生成

with open('data.txt') as f:
    lines=[x.strip() for x in f]
    spaces=lines.count('')   #count the number of empty lines
    odd_spaces=spaces//2+1   #odd lines 1,3,5,7...
    even_spaces=spaces-odd_spaces #even lines 2,4,6,...

    it=iter(range(1,spaces+1)) #create an iterable
    try:
        lines=[x if x!='' else next(it) for x in lines]  #if line is empty then call next(it)
    except StopIteration:
        pass
    for x in lines:
        print(x)

    fil=[4*x+1 for x in range(0,spaces+1) if 4*x+1<spaces] #4x+1
    print(fil)
    row=[lines[lines.index(x)-1] for x in fil]
    print(row)

    fil=[2*x+1 for x in range(0,spaces+1) if 2*x+1<spaces] #2x+1
    print(fil)
    row=[lines[lines.index(x)-1] for x in fil]
    print(row)

<强>输出:

apple
1
ae-pal
2
noun.
3
a fruit
4
ball
5
b'al
6
noun.
7
playing material
round shaped
[1, 5]
['apple', 'ball']
[1, 3, 5]
['apple', 'noun.', 'ball']

答案 3 :(得分:1)

为什么不运行循环计算空行然后插入数据库 正则表达式是重要的吗?

在这里,你可以在php中快速而肮脏地实现

<?php

$filename = $argv[1];

if(file_exists($filename) && is_readable($filename)) {

    $fh = fopen ($filename, "r");
    $count = 0;
    $el = 0;
    $items = array();
    while(!feof($fh)) {
        $line = fgets($fh);
        if($line == "\n")
        {
            $count++;
            if($count == 4)
            {
                $el ++;
                $count = 0;
            }
            continue;
        }
        $items[$el][$count] .= $line;
    }
    fclose($fh);
}
var_dump($items);

?>

在命令行中以php script.php文件名运行它 这就是我得到的

array(4) {
  [0] =>
  array(4) {
    [0] =>
    string(6) "apple\n"
    [1] =>
    string(7) "ae-pal\n"
    [2] =>
    string(6) "noun.\n"
    [3] =>
    string(8) "a fruit\n"
  }
  [1] =>
  array(4) {
    [0] =>
    string(5) "ball\n"
    [1] =>
    string(5) "b'al\n"
    [2] =>
    string(6) "noun.\n"
    [3] =>
    string(30) "playing material\nround shaped\n"
  }
  [2] =>
  array(4) {
    [0] =>
    string(5) "pink\n"
    [1] =>
    string(7) "pe-ank\n"
    [2] =>
    string(6) "color\n"
    [3] =>
    string(14) "girlish\ncolor\n"
  }
  [3] =>
  array(1) {
    [0] =>
    string(0) ""
  }
}