2013-01-15 54 views
0

我有一個數據文件,我需要爲程序使用輸入,但我需要稍微調整格式。使用這種方法:Extracting specific data from a file and writing it to another file我產生看起來像這樣一個文件:在無關數據條目之間添加一個空行

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 

我用這個程序/編碼選項標記了我可用。任何幫助你可以給予非常感謝,謝謝!

+0

我是你所謂的極端初學者大聲笑。我知道如何在每行之間添加空白行,但不知道如何選擇性地將它們添加到 – user1784467

回答

3
perl -pae 'print $/ if (defined $x && $x ne $F[0]); $x = $F[0];' input.txt 

這將檢查的第一個字段$F[0]上日領域,存儲在$x可以達到類似的結果。如果它們不相同,則打印換行符。

說明:

  • -p讀取文件和打印在空白每行
  • -a自動分割線爲@F陣列
  • $/是你的輸入記錄分隔符,默認爲換行符。
+0

感謝您的代碼,尤其是對於解釋。感謝其他的海報! – user1784467

+0

@ user1784467不客氣。 – TLP

+0

@TLP:是否需要「定義」檢查? – Zaid

3
$ perl -api -e 'print "\n" unless $seen{$F[0]}++ && $. > 1;' file.txt 
+0

+1,但這隻有在第一個字段不再出現時纔有效。 – TLP

+0

嘿,這很有幫助。最終我使用了其他代碼,因爲我不能保證第一個字段不會再出現;我正在研究DNA的編碼序列,反向鏈上可能有相同的標識符但最終是唯一的外顯子。而且有大約9000個序列,所以我不能檢查= P。謝謝! – user1784467

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 
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)) 
相關問題