使用awk或sed将行转换为列

使用awk或sed将行转换为列,awk,sed,Awk,Sed,我有一个*.xvg格式的文件。 它包含六列,每列有500个数字。 除时间列(第一列)外,所有其他列都包含浮点数 我想以相同的格式生成一个输出文件,在该文件中,这些列被转换成行,每个数字用空格分隔 我已经用C写了一个程序,它对我来说很好,但我正在寻找一种使用awk或sed的替代方法,这将允许我做同样的事情 我是这些脚本语言的新手。在之前的问题中,我找不到任何相关的答案。因此,如果有人能帮我完成这项任务,我将不胜感激 输入文件如下所示:- # This file was created Thu

我有一个*.xvg格式的文件。
它包含六列,每列有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令人印象深刻的用法。加一。