0

1 つのディレクトリから 115 個のファイルを結合しようとしています。ファイルがどのように見えるかの例を次に示します。

ファイル 1

表現型マーカー Value1 Value2 Value3
P1 1:54390 0.2948 0.4837 0.2198
P2 1:54390 0.3482 0.6583 0.1937
P3 1:54390 0.1983 0.1837 0.4177
P4 1:54390 0.9128 0.9930 0.0043
P5 1:54390 0.1938 0.0109 0.6573
P1 1:69402 0.2039 0.2340 0.2346
P2 1:69402 0.0239 0.3545 0.1987
P3 1:69402 0.8239 0.8677 0.4177
P4 1:69402 0.2498 0.3099 0.0765
P5 1:69402 0.0982 0.0198 0.0123

ファイル 2

表現型マーカー Value1 Value2 Value3
P1 9:21048 0.8568 0.1231 0.1654
P2 9:21048 0.1244 0.3213 0.1223
P3 9:21048 0.9869 0.1231 0.4776
P4 9:21048 0.3543 0.7657 0.0033
P5 9:21048 0.1231 0.3213 0.8578
P1 9:87758 0.1231 0.8768 0.4653
P2 9:87758 0.7657 0.5435 0.8845
P3 9:87758 0.9879 0.8437 0.7464
P4 9:87758 0.1231 0.9879 0.5523
P5 9:87758 0.9879 0.9868 0.0006

したがって、基本的に各ファイルには一意のマーカー セットがあり、5 つの表現型 (P1、P2、P3、P4、P5) のすべてがそれらと一致します。

いくつかのこと:

A. データが表現型ごとに整理されている 1 つのファイルを次のようにします (下図)。

表現型マーカー Value1 Value2 Value3
P1 1:54390 0.2948 0.4837 0.2198
P1 1:69402 0.2039 0.2340 0.2346
P1 9:21048 0.8568 0.1231 0.1654
P1 9:87758 0.1231 0.8768 0.4653
P2 1:54390 0.3482 0.6583 0.1937
P2 1:69402 0.0239 0.3545 0.1987
P2 9:21048 0.1244 0.3213 0.1223     
P3 1:54390 0.1983 0.1837 0.4177
P3 1:69402 0.8239 0.8677 0.4177
P3 9:21048 0.9869 0.1231 0.4776
P3 9:87758 0.9879 0.8437 0.7464
P4 1:54390 0.9128 0.9930 0.0043
P4 1:69402 0.2498 0.3099 0.0765
P4 9:21048 0.3543 0.7657 0.0033
P4 9:87758 0.1231 0.9879 0.5523
P5 1:54390 0.1938 0.0109 0.6573
P5 1:69402 0.0982 0.0198 0.0123
P5 9:21048 0.1231 0.3213 0.8578
P5 9:87758 0.9879 0.9868 0.0006

これをbashで行いたいと思います。誰かが私にいくつかの洞察を提供できますか? 私はこの言語に非常に慣れていません!

B. この巨大なファイルを取得したら、表現型に基づいて個別のファイルを保存したいので (途中で品質管理手順を実行する予定です)、P1、P2、P3、P4 の 5 つのファイルを作成します。 、および P5 と他の列のそれぞれのデータ)

4

4 に答える 4

2

A を解決するには、spiehr によって提案されたアプローチを使用できます。B を解決するには:

# Name of your big merged file
BIG_FILE='...'


TYPES='P1 P2 P3 P4 P5'    
for T in $TYPES; do
    # Will reduce the input file to
    # all lines starting with $T, which is one of P1, P2 etc.,
    # and write them to a file named accordingly
    grep "^$T" $BIG_FILE > file_$T
done
于 2013-05-07T19:53:44.923 に答える
0

最初のステップを次のように書きます

{
    sed 1q file1
    sed 1d * | sort
} > file_all

それから

awk '
    FNR == 1 {head = $0; next}
    !seen[$1]++ {print head > $1}
    {print > $1}
' file_all

これにより、「P1」、「P2」などの名前のファイルが作成されます

于 2013-05-08T02:30:26.983 に答える
0

列タイトルを含むヘッダーを取得するには:

head -1 > tmpfile

データは次のように挿入できます。

for file in $(ls); do
    tail -n +2 ${file} >> tmpfile2
done
sort tmpfile2 >> tmpfile
rm tmpfile2

tmpfile は、すべてのデータを含むファイルになります。$(ls) を書く代わりに、関連するすべてのファイルを一覧表示する別の Linux コマンドを追加できます。

最初の列に「P3」が含まれるエントリのみを取得するには、grep を使用できます。

grep '^P3' tmpfile | cut -f1 --complement

cut コマンドは、最初のエントリを切り取るために使用されます。おそらくもう必要ありません。

于 2013-05-07T19:30:28.650 に答える