同様の行を並べ替える awk スクリプト

同様の行を並べ替える awk スクリプト

約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列の列は情報が失われます。したがって、コードロジックに重大な欠陥があります。

お持ちの場合いいえawkTAB区切り文字を使用しますが、すべてのスペースには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。)

おすすめ記事