0

このようなタブ区切りのファイルがあります。

"""chr1"    "38045559"  "38046059"  "C1orf122"""
""""    ""  ""  "C1orf122"""
""""    ""  ""  "YRDC"""
"""chr1"    "205291045" "205291545" "YOD1"""
"""chr1"    "1499717"   "1500625"   "SSU72"""

このコマンドから .csv をタブ区切りファイルに変換した後、このファイルを取得しました

perl -lpe 's/"/""/g; s/^|$/"/g; s/","/\t/g' <test.csv>test_tab

ここで、ファイルをタブ区切りのままにしたいのですが、余分な引用符はすべてファイルから削除する必要があります。しかし、列 4 を印刷すると同時に、すべての名前と列 1、2、および 3 の座標を取得する必要があります (これはまだ取得できますが、引用符が付きます)。

上記のコマンドでどのような操作を行う必要がありますか、親切にガイドしてください。

必要な出力は(明確にするように求められたため)

chr1    38045559    38046059    C1orf122
                                C1orf122
                                YRDC
chr1    205291045   205291545   YOD1
chr1    1499717     1500625     SSU72

列4を抽出すると、取得する必要があります

    C1orf122
    C1orf122
    YRDC 
    YOD1
    SSU72

ありがとうございました

4

1 に答える 1

2

これらの引用符のほとんどは、ファイルを取り込むコマンドによって挿入されているようです。代わりに、通常どおりファイルを開きます。

use strict;
use warnings;

open CSV, 'test.csv' or die "can't open input file.";
open TAB, '>test.tab' or die "can't open output file.";

my @row_array;

while (<CSV>)
{
    #Remove any quotes that exist on the line (it is in default variable $_).
    s/"//g;

    #Split the current row into an array.
    my @fields = split /,/; 

    #write the output, tab-delimited file.
    print TAB join ("\t", @fields) . "\n";

    #Put the row into a multidimensional array.
    push @row_array, \@fields;
}

print "Column 4:\n";
print $_->[3] . "\n" foreach (@row_array);

print "\nColumns 1-3:\n";
print "@{$_}[0..2]\n" foreach (@row_array);

まだ存在する引用符はs/"//g;、上記のコードで削除されます。これにより、すべての引用符が削除されます。それらがフィールドの最初と最後にあるかどうかはチェックしません。保持する必要があるデータ内にいくつかの引用符がある場合は、より洗練された一致パターンが必要になります。

更新:タブ区切りの出力ファイルを作成するコードを追加しました。「すべての名前と座標」を取得することに関連する要件が何であるかが正確にはわかりません。ただし、そのために上記のコードを使用できるはずです。「何かをする」と書かれている場所に必要なものを追加するだけです。たとえば、列 1 を で参照できます$fields[0]

更新 2:列 4、次に列 1 ~ 3 を抽出するコードを追加しました。多次元配列を使用するための構文は注意が必要です。詳細については、 perldscperlrefを参照してください。

更新 3:ファイルにまだ存在する引用符を削除するコードを追加しました。

于 2012-10-09T08:59:59.537 に答える