使用awk或sed将行转换为列
我有一个*.xvg格式的文件。使用awk或sed将行转换为列,awk,sed,Awk,Sed,我有一个*.xvg格式的文件。 它包含六列,每列有500个数字。 除时间列(第一列)外,所有其他列都包含浮点数 我想以相同的格式生成一个输出文件,在该文件中,这些列被转换成行,每个数字用空格分隔 我已经用C写了一个程序,它对我来说很好,但我正在寻找一种使用awk或sed的替代方法,这将允许我做同样的事情 我是这些脚本语言的新手。在之前的问题中,我找不到任何相关的答案。因此,如果有人能帮我完成这项任务,我将不胜感激 输入文件如下所示:- # This file was created Thu
它包含六列,每列有500个数字。
除时间列(第一列)外,所有其他列都包含浮点数 我想以相同的格式生成一个输出文件,在该文件中,这些列被转换成行,每个数字用空格分隔 我已经用C写了一个程序,它对我来说很好,但我正在寻找一种使用awk或sed的替代方法,这将允许我做同样的事情 我是这些脚本语言的新手。在之前的问题中,我找不到任何相关的答案。因此,如果有人能帮我完成这项任务,我将不胜感激 输入文件如下所示:-
# This file was created Thu Oct 1 17:18:10 2015
# by the following command:
# /home/durba/gmx455/bin/mdrun -np 1 -deffnm md0 -v
#
@ title "dH/d\xl\f{}, \xD\f{}H"
@ xaxis label "Time (ps)"
@ yaxis label "(kJ/mol)"
@TYPE xy
@ subtitle "T = 200 (K), \xl\f{} = 0"
@ view 0.15, 0.15, 0.75, 0.85
@ legend on
@ legend box on
@ legend loctype view
@ legend 0.78, 0.8
@ legend length 2
@ s0 legend "dH/d\xl\f{} \xl\f{} 0"
@ s1 legend "\xD\f{}H \xl\f{} 0.05"
0 19.3191 1.16531 1.8 -447.07 -47.07
2 -447.072 -17.6454 1.5 -17.633 -1.33
4 -17.633 -0.446508 1.3 -75.455 -5.45
6 -75.4555 -2.83981 1.4 -28.724 -28.4
8 -28.7246 -0.884639 1.5 -41.877 -14.87
10 -41.8779 -1.45569 2.8 -43.685 -3.685
12 -43.6851 -1.4797 -3.1 -91.651 -91.651
14 -91.6515 -3.52492 -3.5 -61.135 -1.135
16 -61.1356 -2.30129 -3.2 -48.847 -48.47
输出文件应如下所示:-
# This file was created Thu Oct 1 17:18:10 2015
# by the following command:
# /home/durba/gmx455/bin/mdrun -np 1 -deffnm md0 -v
#
@ title "dH/d\xl\f{}, \xD\f{}H"
@ xaxis label "Time (ps)"
@ yaxis label "(kJ/mol)"
@TYPE xy
@ subtitle "T = 200 (K), \xl\f{} = 0"
@ view 0.15, 0.15, 0.75, 0.85
@ legend on
@ legend box on
@ legend loctype view
@ legend 0.78, 0.8
@ legend length 2
@ s0 legend "dH/d\xl\f{} \xl\f{} 0"
@ s1 legend "\xD\f{}H \xl\f{} 0.05"
0 2 4 6 8 10 12
19.3191 -447.072 -17.633 -17.633 -75.4555 -28.7246 -41.8779 -43.6851 -91.6515 -61.1356
1.16531 -17.6454 -0.446508 -2.83981 -0.884639 -1.45569 -1.4797 -3.52492 -2.30129
1.8 1.5 1.3 1.4 1.5 2.8 -3.1 -3.5 -3.2
-447.07 -17.633 -75.455 -28.724 -41.877 -43.685 -91.651 -61.135 -48.847
-47.07 -1.33 -5.45 -28.4 -14.87 -3.685 -91.651 -1.135 -48.47
请注意,两个文件中以“#”和“@”开头的行应该相同。回答原始问题
让我们考虑这个测试文件:
$ cat file
123 1.2 1.3 1.4 1.5
124 2.2 2.3 2.4 2.5
125 3.2 3.3 3.4 3.5
要将列转换为行,请执行以下操作:
$ awk '{for (i=1;i<=NF;i++)a[i,NR]=$i} END{for (i=1;i<=NF;i++) for (j=1;j<=NR;j++) printf "%s%s",a[i,j],(j==NR?ORS:OFS)}' file
123 124 125
1.2 2.2 3.2
1.3 2.3 3.3
1.4 2.4 3.4
1.5 2.5 3.5
修订问题的答覆
在修订后的问题中,文件开头有以@
或#
开头的行不可更改。在这种情况下:
$ awk '/^[@#]/{print;next}{k++; for (i=1;i<=NF;i++)a[i,k]=$i;} END{for (i=1;i<=NF;i++) for (j=1;j<=k;j++) printf "%s%s",a[i,j],(j==k?ORS:OFS)}' input
# This file was created Thu Oct 1 17:18:10 2015
# by the following command:
# /home/durba/gmx455/bin/mdrun -np 1 -deffnm md0 -v
#
#
#
@ title "dH/d\xl\f{}, \xD\f{}H"
@ xaxis label "Time (ps)"
@ yaxis label "(kJ/mol)"
@TYPE xy
@ subtitle "T = 200 (K), \xl\f{} = 0"
@ view 0.15, 0.15, 0.75, 0.85
@ legend on
@ legend box on
@ legend loctype view
@ legend 0.78, 0.8
@ legend length 2
@ s0 legend "dH/d\xl\f{} \xl\f{} 0"
@ s1 legend "\xD\f{}H \xl\f{} 0.05"
0 2 4 6 8 10 12 14 16
19.3191 -447.072 -17.633 -75.4555 -28.7246 -41.8779 -43.6851 -91.6515 -61.1356
1.16531 -17.6454 -0.446508 -2.83981 -0.884639 -1.45569 -1.4797 -3.52492 -2.30129
1.8 1.5 1.3 1.4 1.5 2.8 -3.1 -3.5 -3.2
-447.07 -17.633 -75.455 -28.724 -41.877 -43.685 -91.651 -61.135 -48.847
-47.07 -1.33 -5.45 -28.4 -14.87 -3.685 -91.651 -1.135 -48.47
$awk'/^[@#]/{print;next}{k++;for(i=1;i回答原始问题
让我们考虑这个测试文件:
$ cat file
123 1.2 1.3 1.4 1.5
124 2.2 2.3 2.4 2.5
125 3.2 3.3 3.4 3.5
要将列转换为行,请执行以下操作:
$ awk '{for (i=1;i<=NF;i++)a[i,NR]=$i} END{for (i=1;i<=NF;i++) for (j=1;j<=NR;j++) printf "%s%s",a[i,j],(j==NR?ORS:OFS)}' file
123 124 125
1.2 2.2 3.2
1.3 2.3 3.3
1.4 2.4 3.4
1.5 2.5 3.5
修订问题的答覆
在修订后的问题中,文件开头有以@
或#
开头的行不能更改。在这种情况下:
$ awk '/^[@#]/{print;next}{k++; for (i=1;i<=NF;i++)a[i,k]=$i;} END{for (i=1;i<=NF;i++) for (j=1;j<=k;j++) printf "%s%s",a[i,j],(j==k?ORS:OFS)}' input
# This file was created Thu Oct 1 17:18:10 2015
# by the following command:
# /home/durba/gmx455/bin/mdrun -np 1 -deffnm md0 -v
#
#
#
@ title "dH/d\xl\f{}, \xD\f{}H"
@ xaxis label "Time (ps)"
@ yaxis label "(kJ/mol)"
@TYPE xy
@ subtitle "T = 200 (K), \xl\f{} = 0"
@ view 0.15, 0.15, 0.75, 0.85
@ legend on
@ legend box on
@ legend loctype view
@ legend 0.78, 0.8
@ legend length 2
@ s0 legend "dH/d\xl\f{} \xl\f{} 0"
@ s1 legend "\xD\f{}H \xl\f{} 0.05"
0 2 4 6 8 10 12 14 16
19.3191 -447.072 -17.633 -75.4555 -28.7246 -41.8779 -43.6851 -91.6515 -61.1356
1.16531 -17.6454 -0.446508 -2.83981 -0.884639 -1.45569 -1.4797 -3.52492 -2.30129
1.8 1.5 1.3 1.4 1.5 2.8 -3.1 -3.5 -3.2
-447.07 -17.633 -75.455 -28.724 -41.877 -43.685 -91.651 -61.135 -48.847
-47.07 -1.33 -5.45 -28.4 -14.87 -3.685 -91.651 -1.135 -48.47
$awk'/^[@#]/{print;next}{k++;for(i=1;i这可能适合您(GNU-sed):
将文件拖到保留空间(HS)中,删除图案空间(PS)直到满足文件结束条件。在文件结束时,将HS替换为PS。将PS复制到HS,然后全局删除除换行后的第一个字段外的所有字段,第一个字段后跟空格。删除最后一个空格并打印该行。然后从HS中调用该行的副本,并执行相反的操作。如果有任何替换,则已成功重复此过程,直到只存在换行符。删除不需要的换行符
由于第一次回答原始问题的方式发生了变化。下面的新解决方案使用基本相同的方法来解决新问题:
sed -r '/^[0-9]/{s/ +/ /g;H};//!p;$!d;x;:a;h;s/\n(\S+)[^\n]*/\1 /g;s/ $//p;g;s/\n\S+ ?/\n/g;ta;d' file
这可能适用于您(GNU-sed):
将文件拖到保留空间(HS)中,删除图案空间(PS)直到满足文件结束条件。在文件结束时,将HS替换为PS。将PS复制到HS,然后全局删除除换行后的第一个字段外的所有字段,第一个字段后跟空格。删除最后一个空格并打印该行。然后从HS中调用该行的副本,并执行相反的操作。如果有任何替换,则已成功重复此过程,直到只存在换行符。删除不需要的换行符
由于第一次回答原始问题的方式发生了变化。下面的新解决方案使用基本相同的方法来解决新问题:
sed -r '/^[0-9]/{s/ +/ /g;H};//!p;$!d;x;:a;h;s/\n(\S+)[^\n]*/\1 /g;s/ $//p;g;s/\n\S+ ?/\n/g;ta;d' file
你能给我看一下*.xvg文件的内容和预期的输出吗?你能给我看一下*.xvg文件的内容和预期的输出吗?太棒了。效果很好。还有一件事,如何在我的输出文件中打印以“@”和“#”开头的行。我想我可能不得不使用这个东西“awk”/^[@#/“@VikasDubey很高兴它成功了。是的,这是正确的命令,可以只选择以@
或#
@VikasDubey开头的行。我现在看到了修改后的问题。我刚刚添加了代码来处理:查看更新的答案。非常感谢。太棒了。太棒了。效果很好。还有一件事,如何打印以“@”开头的行。”和“#”,在我的输出文件中。我想我可能必须使用这个东西“awk”/^[@#]/“@VikasDubey很高兴它成功了。而且,是的,这是正确的命令,可以只选择以@
或#
开头的行@VikasDubey我现在看到了修改后的问题。我刚刚添加了代码来处理:查看更新后的答案。非常感谢。太棒了。这是sed令人印象深刻的用法。再加上一个。这是sed令人印象深刻的用法。加一。