Bashは複数のファイルの列を連結します。

Bashは複数のファイルの列を連結します。

私の周りに一つあります。20pathtofiles.inファイルが別のフォルダーにある場合は、whichlistsという別のファイルを作成しました。情報:

/home/users/gray_wolf/unix/File_1.tsv
/home/users/gray_wolf/unix/File_2.tsv
.
.
.

各ファイルにはおおよその内容が含まれています。11 リストについて100,000 いいね。例:

ファイル1:

Chromosome    begin    end    .....
chr1          1000     2000
chr1          2000     3000
chr1          4000     5000
chr1          5000     6000
chr1          10000    12000
chr1          12000    13000

ファイル_2:

Chromosome    begin    end    .....
chr1          1000     2000
chr1          4000     5000
chr1          5000     6000
chr1          6000     7000
chr1          10000    12000
chr1          13000    14000

最終必須ファイル形式:

Chromosome    begin    end     Column5                    column8 
chr1          1000     2000    File1,File2,File3...       File1,File2,File3...
chr1          2000     3000    File1,File2(0),File3       File1,File2(0),File3...
chr1          4000     5000    File1,File2,File3...       File1,File2,File3...
chr1          5000     6000    File1,File2,File3...       File1,File2,File3...
chr1          6000     7000    File1,File2,File3...       File1,File2,File3...
chr1          10000    12000   File1,File2,File3...       File1,File2,File3...
chr1          12000    13000   File1,File2,File3...       File1,File2,File3...
chr1          13000    14000   File1(0),File2,File3...    File1(0),File2,File3...

pathtofile.in私がこれを次のように渡すとき:script.sh

./script.sh < pathtofile.in

...スクリプトは与えられたファイルを読み込み、pathtofiles.in出力する必要があります。5- 列タブで区切られたリスト。最初サム出力列は次のようにする必要があります。サム リスト各ファイルの結合された。これ4出力列は対応する行でなければなりません。5カンマで区切られたすべての入力ファイルの列(と同じ順序pathtofiles.in)。これ5出力列は対応する行でなければなりません。8カンマで区切られたすべての入力ファイルの列。

特定の入力行に列がない場合8、(または列5)、その位置に「(0)」を出力します。

熱を個別に切って生地/参加する機能を実行しますが、ファイルごとに行数が異なるため、順序が間違っています。どうやって使うの?アッまたは、以下で実行される他のコマンド強く打つ

よろしくお願いします。

〜M

ベストアンサー1

簡単な解決策:paste3つのファイルをまとめて必要な列をインポートします。

paste -d' ' file1 file2 file3  |\
awk 'BEGIN { FS = " +" } { NR ==1} { printf "%-10s%-7s%-7s  %-12s  %-12s\n" $1,$2,$3,$6,$7 } { NR >=2 } { printf "%-10s%-7s%-7s  %s,%s%s  %s%s%s\n" $1,$2,$3,$6,$7,$8,$9,$10,$11 } '

これは、ファイルと出力形式のデフォルト設定に従って採用する必要があります。説明する:

1)paste -d' '- >スペースを区切り文字として使用して、ツリーファイルを垂直方向にマージします-d

2)パイプで接続し、読みやすくするためにawk新しい行にコマンドを続けます。|\

2.1) BEGIN { FS = " +" }- 以下のすべてに対して、1 つ以上の (+) スペースをフィールド区切り文字として使用します.

2.2)最初の行に{ NR ==1}1、2、3、6、7($1,$2 ...)フィールドを次の形式で印刷します(二重引用符で囲む)。

%-10s10文字の長さの文字列が修正されました(残りは空白で埋められ、左揃え)。

同じ長さの7文字の2倍、スペース2つ、12文字の長い文字列、スペースの2つ、12文字の文字列。\n最後に新しい行を追加します。

(セクションで確認{ printf "%-10s%-7s%-7s %-12s %-12s\n" $1,$2,$3,$6,$7 }

2.2)データ:2行目から{ NR >=2 }始めて列を印刷します。$1,$2,$3,$6,$7,$8,$9,$10,$11形式は次のとおりです。%-10s%-7s%-7s %s,%s,%s %s,%s,%s\n

上記と同様ですが、たとえば、列6,7,8は任意の長さであり、カンマで区切られています。%s,%s,%s

おすすめ記事