有一个文件包含一个表,其中参数名称作为第一行,值在以下几行中:如何使用 或任何 shell 脚本实用程序执行以下awk
操作sed
:
fileXX
生成一个以每行命名的配置文件,- 将每行列值转置为每个生成的配置文件中的行(行),
- 在每个文件中,将表示参数名称的第一行连接到转置的列值,以显示为参数名称-值对。
源文件:
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
您可以使用 GNU datamash
(一种新的命令行程序),它具有具有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
$