script awk para reorganizar linhas semelhantes

1

Eu quero reorganizar cerca de 5 milhões de linhas (com 300 colunas) em grupos.

Os dados são parecidos com os seguintes: onde houve vários experimentos (coluna 2) realizados em locais diferentes (cabeçalhos de coluna na coluna de linha superior 4 em diante) em anos diferentes (coluna 1) usando instrumentos (coluna 3). Os números na matriz (linha 2 em diante, coluna 4 em diante) indicam quantas instâncias de experimentos foram bem-sucedidas.

O que eu quero é reorganizar as linhas

Entrada

                        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

O que eu gostaria de ter são as linhas rearranjadas em grupos de tal forma que

1) Dentro do mesmo ano 2) Usando o mesmo instrumento

crie grupos como esse,

cada grupo tem pelo menos três locais em comum, cada um com pelo menos 20 experiências bem-sucedidas.

Saída solicitada

                        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

Aqui está o que eu tentei, por favor, ajude a alcançar meu objetivo.

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
    
por Sheetal Kaul 30.03.2015 / 02:45

1 resposta

1

Algumas dicas aleatórias, dependendo da formatação real dos dados e outros problemas ...

Como os campos de dados são separados? (Os três primeiros espaçamentos dão a impressão de que há um caractere TAB entre, enquanto as últimas colunas parecem separadas por espaço.) Você deve estar ciente de que as informações da coluna são perdidas para os bicos 4-N se seu separador de campo for definido como padrão . Então a lógica do seu código está seriamente falha.

Se você tiver não separadores TAB, mas todos os espaços em branco você pode usar o recurso awk do GNU FIELDWIDTHS para acessar os dados (incluindo os dados "em branco" ausentes, como você parece ser tentando alcançar).

Se você tiver TABs para os três primeiros separadores e espaços em branco para o restante, defina explicitamente FS="\t" , para que possa trabalhar diretamente nos campos de 1 a 3 e ter o espaçamento intacto nos dados finais (que você pode abordar como um todo como campo 4), o que facilitará a localização de "dados em branco".

Ele pode tornar o processamento mais fácil se você criar subconjuntos de dados em tempo real, operá-los e concatenar os subconjuntos individuais posteriormente. Para separar os dados nos arquivos que estão em, digamos, ano e instrumento , você pode escrever:

awk '{ print > "set_" $1 "_" $3" }' input

e criará arquivos nomeados, por exemplo, set_2015_LEN ou set_2014_IBM contendo as respectivas entradas.

A tarefa final para identificar "conjuntos de colunas numéricas correspondentes" depende dos tópicos mencionados anteriormente; se, por exemplo, as oito colunas de dados finais puderem ser endereçadas como uma entidade de comprimento fixo, será suficiente usar o utilitário sort com uma especificação de chave definida apropriadamente (consulte a opção sort do -k ).

(BTW: para um teste de índice composto em vez de $1,$2,$3 in arr1 você tem que escrever ($1,$2,$3) in arr1 .)

    
por 30.03.2015 / 03:24

Tags