ファイルのパラメータ値を置き換えて、ここでパラメータファイルを生成します。

ファイルのパラメータ値を置き換えて、ここでパラメータファイルを生成します。

awk最初の行にはパラメータ名があり、次の行には値を含むテーブルを含むファイルがあります。または、シェルスクリプトユーティリティを使用して以下を行う方法sed:

  • fileXX各行の名前付き構成ファイルを生成します。
  • 生成された各構成ファイルの各列の値を1行(行)に置き換えます。
  • 各ファイル内のパラメータ名を表す最初の行を転置列値に関連付けて、パラメータ名と値のペアとして表示します。

ソースファイル:

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

結果ファイル:

  • ファイル1

    Column1=Row1_Col1  
    Column2=Row1_Col2  
    Column2=Row1_Col3  
    
  • ファイル2

    Column1=Row2_Col1  
    Column2=Row2_Col2  
    Column2=Row2_Col3  
    
  • ファイル3

    Column1=Row3_Col1  
    Column2=Row3_Col2  
    Column2=Row3_Col3  
    

答え1

厳密な入力検証を含むコマンドを組み込んだ新しいdatamashコマンドラインプログラム(GNU)を使用できます。transpose

例:

$ 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

その後、列に分割しますcut

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

複数のファイルを生成するには、次のコマンドを使用できます。

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

GNU Datamashはここから入手できます:http://www.gnu.org/s/datamash、パッケージは複数のgnu / linuxディストリビューションで利用できます(免責事項:私はdatamash開発者です)。

答え2

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]
    }          
  }
}

以下を介して呼び出します。

awk -f script.awk file_to_process

答え3

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

テスト

$ 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
$ 

関連情報