約500万行(300列)をグループに再配列したいと思います。
データは次のとおりです。さまざまな実験(2列)は、さまざまな年(1列)に機器(3列)を使用して、さまざまな場所(一番上の4列から始まる列見出し)で行われました。行列の数(2行目から4列目から始まる)は、実験が成功したインスタンスの数を示します。
私が望むのは、行を並べ替えることです
入力する
345 346 347 348 349 350 351 352
2014 Exp1 IBM 24 45 22
2014 Exp2 LEN 23 32 34
2014 Exp3 LEN 2 34 34
2014 Exp4 IBM 34 44 43
2014 Exp5 IBM 2 45 51 45
2014 Exp6 IBM 34 23 54
2014 Exp7 IBM 23 23 24
2014 Exp8 IBM 34 45 56
2014 Exp9 LEN 24 45 45
2014 Exp10 LEN 43 45 32
2015 Exp11 IBM 34 55 33 34
2015 Exp12 IBM 1 33 4 5
2015 Exp13 IBM 43 55 34 43
2015 Exp14 IBM 45 32 43 4
2015 Exp15 IBM 23 4 5
2015 Exp16 IBM 32 34 43
2015 Exp17 IBM 32 34 46
2015 Exp18 LEN 32 54 67
2015 Exp19 SCL 56 6 4 45 56
2015 Exp20 LEN 67 56 76
2015 Exp21 LEN 45 56 65
2015 Exp22 SCL 45 55 54
2015 Exp23 SCL 4 55 45
私が望むのは、行を次のグループに並べ替えることです。
1)同一年度以内 2)同一商品の使用
次のようにグループを作成します。
各グループには少なくとも3つの共通位置があり、各位置には少なくとも20回の成功した実験がありました。
要求された出力
345 346 347 348 349 350 351 352
1 2014 Exp1 IBM 24 45 22
1 2014 Exp4 IBM 34 44 43
1 2014 Exp7 IBM 23 23 24
2 2014 Exp2 LEN 23 32 34
2 2014 Exp9 LEN 24 45 45
2 2014 Exp10 LEN 43 45 32
3 2014 Exp5 IBM 2 45 51 45
3 2014 Exp6 IBM 34 23 54
3 2014 Exp8 IBM 34 45 56
4 2015 Exp11 IBM 34 55 33 34
4 2015 Exp13 IBM 43 55 34 43
4 2015 Exp14 IBM 45 32 43 4
5 2015 Exp16 IBM 32 34 43
5 2015 Exp17 IBM 32 34 46
6 2015 Exp18 LEN 32 54 67
6 2015 Exp20 LEN 67 56 76
6 2015 Exp21 LEN 45 56 65
7 2015 Exp19 SCL 56 6 4 45 56
7 2015 Exp22 SCL 45 55 54
2014 Exp3 LEN 2 34 34
2015 Exp12 IBM 1 33 4 5
2015 Exp15 IBM 23 4 5
2015 Exp23 SCL 4 55 45
私が試したことは次のとおりです。
awk ' NR>1{ for (i=4;i<=NF;i++) if ($i!="") arr1[$1,$2,$3]=$i ; next }
$1,$2,$3 in arr1 {
for (j=1;j<length(arr1);j++))
{if (arr1[j] > 20)
group++;
END {
for (j in n) {
print group, arr1[j]
}
}' input input
ベストアンサー1
実際のデータ型やその他の質問に基づくランダムなヒント...
データフィールドはどのように区別されますか? (最初の3つのスペースは中央にタブがあるように見え、最後の列はスペースで区切られているように見えます。)フィールド区切り文字がデフォルトで定義されている場合、4-N列の列は情報が失われます。したがって、コードロジックに重大な欠陥があります。
お持ちの場合いいえawk
TAB区切り文字を使用しますが、すべてのスペースにはGNUの機能を使用してアクセスできますFIELDWIDTHS
(取得しようとしているように「空白」データがありません)。
最初の3つの区切り文字にタブがあり、残りの区切り文字にスペースがある場合は、FS="\t"
フィールド1-3を直接処理し、最後のデータにスペース全体を保持できるように明示的に定義する必要があります(フィールド4が処理されるときに全体として処理できます)。 ))「空のデータ」を簡単に見つけることができます。
データのサブセットを動的に生成し、そのサブセットを処理して個々のサブセットを結合すると、処理が容易になる可能性があります。ファイルのデータを分離するには、次の点によって異なります。年度そして楽器書くことができます:
awk '{ print > "set_" $1 "_" $3" }' input
set_2015_LEN
たとえば、名前が付けられたり、そのset_2014_IBM
エントリを含むファイルが作成されます。
「一致する数値列のセット」を識別する最終操作は、前述のトピックによって異なります。たとえば、最後の8番目のデータ列を固定長エンティティとして扱うことができる場合は、sort
適切に定義されたキー仕様を持つユーティリティを使用するだけで十分です(sort
オプションを参照-k
)。
(BTW:複合インデックステストの場合は$1,$2,$3 in arr1
作成する必要があります($1,$2,$3) in arr1
。)