Transpor valores de parâmetros de um arquivo e gerar arquivos de parâmetros a partir dele

1

Há um arquivo contendo uma tabela com os nomes dos parâmetros como a primeira linha, valores nas seguintes linhas: Como executar o seguinte usando awk , sed ou qualquer utilitário de script de shell:

  • gera um arquivo de configuração chamado fileXX para cada linha,
  • transponha os valores de coluna de cada linha para linhas (linhas) em cada arquivo de configuração gerado,
  • em cada arquivo, concatene a primeira linha que representa os nomes dos parâmetros com os valores das colunas transpostas para que apareçam como pares nome-valor do parâmetro.

Arquivo de origem:

Column1     Column2      Column3  
Row1_Col1   Row1_Col2   Row1_Col3  
Row2_Col1   Row2_Col2   Row2_Col3  
Row3_Col1   Row3_Col2   Row3_Col3  

Arquivos OUtPut:

  • Arquivo1

    Column1=Row1_Col1  
    Column2=Row1_Col2  
    Column2=Row1_Col3  
    
  • Arquivo2

    Column1=Row2_Col1  
    Column2=Row2_Col2  
    Column2=Row2_Col3  
    
  • File3

    Column1=Row3_Col1  
    Column2=Row3_Col2  
    Column2=Row3_Col3  
    
por Tahoon 05.01.2016 / 18:24

3 respostas

2

Você pode usar o GNU datamash (um novo programa de linha de comando ish), que possui o comando transpose integrado com validação de entrada restrita.

Exemplo:

$ cat in.txt
Column1     Column2     Column3
Row1_Col1   Row1_Col2   Row1_Col3
Row2_Col1   Row2_Col2   Row2_Col3
Row3_Col1   Row3_Col2   Row3_Col3

$ datamash transpose < in.txt
Column1 Row1_Col1   Row2_Col1   Row3_Col1
Column2 Row1_Col2   Row2_Col2   Row3_Col2
Column3 Row1_Col3   Row2_Col3   Row3_Col3

Em seguida, divida por colunas com cut :

$ datamash transpose < in.txt | cut -f1,3 | tr '\t' '='
Column1=Row2_Col1
Column2=Row2_Col2
Column3=Row2_Col3

Para criar vários arquivos, você pode usar isto:

for i in 2 3 4 ; do
   datamash transpose < in.txt | cut -f1,$i | tr '\t' '=' > file$i.txt
done

O GNU Datamash está disponível aqui: link , e pacotes estão disponíveis em várias distribuições gnu / linux (disclaimer: Sou desenvolvedor de datamash ).

    
por 05.01.2016 / 23:12
1

Você pode fazer isso com o awk:

{
  # extract files names form first line
  if (1 == NR) {
    num_fields = NF       
    for(i = 1; i <= num_fields ; i++)
    {
      # get line header
      header[i] = $i
      # create file name
      file[i] = "file-"i
    }
  }
  else 
  {
    # extract data if not first line
    for (i = 1; i <= num_fields; i++)
    {
      print header[i] ":" $i > file[i]
    }          
  }
}

E invoque-o com:

awk -f script.awk file_to_process
    
por 05.01.2016 / 21:33
0
src=/the/source/file
set -- 'head -1 $src';
col1=$1 ; col2=$2 ; col3=$3; i=0;
grep -v "'head -1 $src'" $src | while read c1 c2 c3
  do
    echo -e "$col1=$c1\n$col2=$c2\n$col3=$c3" > file-$((i=i+1)).out ; 
  done

teste

$ cat $src
Column1     Column2      Column3  
Row1_Col1   Row1_Col2   Row1_Col3  
Row2_Col1   Row2_Col2   Row2_Col3  
Row3_Col1   Row3_Col2   Row3_Col3
$ set -- 'head -1 $src'; i=0; col1=$1 ; col2=$2 ; col3=$3; i=0; grep -v "'head -1 $src'" $src | while read c1 c2 c3 ; do echo -e "$col1=$c1\n$col2=$c2\n$col3=$c3\n" > file-$((i=i+1)).out ; done
$ cat file-1.out 
Column1=Row1_Col1
Column2=Row1_Col2
Column3=Row1_Col3
$ cat file-2.out 
Column1=Row2_Col1
Column2=Row2_Col2
Column3=Row2_Col3
$ cat file-3.out 
Column1=Row3_Col1
Column2=Row3_Col2
Column3=Row3_Col3
$ 
    
por 05.01.2016 / 19:30