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
$