さまざまな可能な組み合わせを見つける

さまざまな可能な組み合わせを見つける

ファイルAには複数行の遺伝子がある。

A、B、C、D、EP
、Q、R
G、D、V、KL
、Q、X、I、U、Gなど

一度に各行をインポートすると、次の種類の出力をどのように取得できますか?

最初の行の場合:

A、B、C、B、C、D、C

D、

2行目の場合:

血、キュー、卵

3行目の場合:

G、D、V
D、V、K

本質的に私が望むのは、各行で遺伝子の「三重項」を見つけることです。最初の三重項には最初の3つの遺伝子があります。 2番目の三重項は2番目、3番目、4番目の遺伝子を持ちます。最後の三重項は行の最後の遺伝子で終わります。
これを手動で達成するのは難しい作業です。まだLinux、Perl、またはPythonをマスターしていないため、スクリプトを作成できません。したがって、このコミュニティの助けをいただきありがとうございます!

ベストアンサー1

使用awk:

function wprint() {
    print w[1], w[2], w[3];
}

function wshift(e) {
    w[1] = w[2]; w[2] = w[3]; w[3] = e;
}

BEGIN { FS = OFS = "," }

{
    wshift($1);
    wshift($2);
    wshift($3);
    wprint();

    for (i = 4; i <= NF; ++i) {
        wshift($i);
        wprint();
    }
}

それから:

$ awk -f script data.in
A,B,C
B,C,D
C,D,E
P,Q,R
G,D,V
D,V,K
L,Q,X
Q,X,I
X,I,U
I,U,G

スクリプトawkは3つの要素で構成される移動ウィンドウを使用しますw。各入力行に対して、ウィンドウの3つの要素を最初の3つのフィールドで埋め、それをカンマで区切ったリスト(後に改行文字が続く)として印刷します。次に、行の残りのフィールドを繰り返してウィンドウに移動し、各要素のウィンドウを印刷します。

入力データの行に2つ未満のフィールドが含まれていると、同様の結果が得られます。

A,,

または

A,B,

出力から。

各入力行に少なくとも3つのフィールドがあると確信している場合(またはそうでない行を無視したい場合)、awkスクリプトを少し短くすることができます。

function wprint() {
    print w[1], w[2], w[3];
}

function wshift(e) {
    w[1] = w[2]; w[2] = w[3]; w[3] = e;
}

BEGIN { FS = OFS = "," }

{
    for (i = 1; i <= NF; ++i) {
        wshift($i);
        if (i >= 3) {
            wprint();
        }
    }
}

可変ウィンドウサイズを使用するスクリプトの最初のバリエーション一般化:

function wprint(i) {
    for (i = 1; i < n; ++i) {
        printf("%s%s", w[i], OFS);
    }
    print w[n]
}

function wshift(e,i) {
    for (i = 1; i < n; ++i) {
        w[i] = w[i + 1];
    }
    w[n] = e;
}

BEGIN { FS = OFS = "," }

{
    for (i = 1; i <= n; ++i) {
        wshift($i);
    }
    wprint();

    for (i = n + 1; i <= NF; ++i) {
        wshift($i);
        wprint();
    }
}

それを書く:

$ awk -v n=4 -f script data.in
A,B,C,D
B,C,D,E
P,Q,R,
G,D,V,K
L,Q,X,I
Q,X,I,U
X,I,U,G

おすすめ記事