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

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 に答える
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 に答える