0

我有一个数据文件,我需要为程序使用输入,但我需要稍微调整一下格式。使用这种方法:从文件中提取特定数据并将其写入另一个文件我生成了一个如下所示的文件:

PITG_00002  2   397
PITG_00004  1   1275
PITG_00004  1397    1969
PITG_00005  200 1111
PITG_00005  1281    1646
PITG_00006  1   816
PITG_00009  2398    3276
PITG_00009  1536    1952
PITG_00010  1   537

我需要通过在唯一的序列之间添加一个空行来区分来自同一序列(第一列)的数据和来自不同序列的数据,使其看起来像:

PITG_00002  2   397

PITG_00004  1   1275
PITG_00004  1397    1969

PITG_00005  200 1111
PITG_00005  1281    1646

PITG_00006  1   816

PITG_00009  2398    3276
PITG_00009  1536    1952

PITG_00010  1   537

我用我可用的程序/编码选项标记了它。非常感谢您提供的任何帮助,谢谢!

4

4 回答 4

3
$ perl -api -e 'print "\n" unless $seen{$F[0]}++ && $. > 1;' file.txt
于 2013-01-15T19:20:53.160 回答
3
perl -pae 'print $/ if (defined $x && $x ne $F[0]); $x = $F[0];' input.txt

这将检查第一个字段$F[0]与前一个字段,存储在$x. 如果它们不相同,则打印一个换行符。

说明:

  • -p读取文件并打印每一行
  • -a将空格上的行自动拆分为@F数组
  • $/是您的输入记录分隔符,默认为换行符。
于 2013-01-15T19:30:29.467 回答
1

我现在没有unix环境,所以我不能直接写代码。我会告诉你伪代码。

 loop all lines
     read line
     var=`echo $line | cut -f 1 -d ' '` #P000_0002
     num=`echo $line | cut -f 2 -d '_'` #0002
     if ($prevnum != $num)
         echo "" >> newfile
     echo $line >> newfile
     prevnum = $num
 end loop
于 2013-01-15T19:25:56.983 回答
1

如果你想坚持使用 Python。使用 itertools.groupby 可以获得类似的结果

>>> with open("test.txt") as fin, open("test.out","w") as fout:
    groups = groupby(((e.split()[0],e) for e in fin),
             key = operator.itemgetter(0))
    for key, group in groups:
        fout.write('\n'.join(e[1] for e in group))
于 2013-01-15T19:27:08.840 回答