【问题标题】:How to use GREP and put the results on diferent columns but on the same lines如何使用 GREP 并将结果放在不同的列但在同一行
【发布时间】:2020-05-21 21:14:32
【问题描述】:

在这里,我有一个输入示例,我想用它来生成特定的输出。

  1.2840   -1.6830    1.4460 C 
  1.5660   -0.8240    0.2163 C 
  0.5584    0.2995   -0.0595 C 
 -0.8805   -0.1514   -0.2412 C 
 -1.6205   -0.3785    0.8741 O 
 -1.4770    0.3883    2.0816 C 
 -1.3875   -0.2971   -1.3503 O 
 -2.0561    1.7788    1.8987 C 
  1.8097   -1.5560   -0.8246 O 
  2.8979   -0.2777    0.3226 N 
  1.2555   -1.0711    2.3543 H 
  0.3266   -2.2122    1.3666 H 
  2.0525   -2.4514    1.6103 H 
  0.8193    0.8445   -0.9811 H 
  0.6122    1.0718    0.7144 H 
 -0.4400    0.4244    2.4204 H 
 -2.0425   -0.1400    2.8563 H 
 -3.0985    1.7209    1.5688 H 
 -1.5098    2.3359    1.1312 H 
 -2.0131    2.3425    2.8349 H 
  3.1017    0.3084    1.1257 H 
  3.4860   -1.1139    0.2817 H 
  3.0712    0.1760   -0.5761 H

最后一列对应分子的原子,其他列是这些原子的坐标。

在原始文件中,我有很多与此示例类似的行和很多其他内容,使用一些代码我可以(使用 grep)捕获这些行并隔离,而不是在一个唯一文件中。 但是,问题是对应于原子的列位于坐标的右侧,我需要它位于输出中坐标的左侧。有没有办法做到这一点?

我正在考虑 grep,因为我正在使用它从我的原始文件中提取坐标和原子,但它直到现在才起作用。

以下正是我需要的:

C   1.2840   -1.6830    1.4460
C   1.5660   -0.8240    0.2163
C   0.5584    0.2995   -0.0595
C  -0.8805   -0.1514   -0.2412
O  -1.6205   -0.3785    0.8741
C  -1.4770    0.3883    2.0816
O  -1.3875   -0.2971   -1.3503
C  -2.0561    1.7788    1.8987
O   1.8097   -1.5560   -0.8246
N   2.8979   -0.2777    0.3226
H   1.2555   -1.0711    2.3543
H   0.3266   -2.2122    1.3666
H   2.0525   -2.4514    1.6103
H   0.8193    0.8445   -0.9811
H   0.6122    1.0718    0.7144
H  -0.4400    0.4244    2.4204
H  -2.0425   -0.1400    2.8563
H  -3.0985    1.7209    1.5688
H  -1.5098    2.3359    1.1312
H  -2.0131    2.3425    2.8349
H   3.1017    0.3084    1.1257
H   3.4860   -1.1139    0.2817
H   3.0712    0.1760   -0.5761

【问题讨论】:

  • 你能展示一个你想要的输出的小例子吗?
  • 为此使用awk。您可以测试特定列,并对结果中的列重新排序。
  • grep 仅用于打印与模式匹配的行但看起​​来您的结果与输入的行相同,为什么您认为grep 是正确的?跨度>
  • 欢迎来到 Stack Overflow。 SO 是面向专业和热情的程序员的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。

标签: sed grep


【解决方案1】:
awk '{print $4 " " $1 " " $2 " " $3 }' /tmp/atom.txt 

会给你

C 1.2840 -1.6830 1.4460
C 1.5660 -0.8240 0.2163
C 0.5584 0.2995 -0.0595
C -0.8805 -0.1514 -0.2412
O -1.6205 -0.3785 0.8741
C -1.4770 0.3883 2.0816
O -1.3875 -0.2971 -1.3503
C -2.0561 1.7788 1.8987
O 1.8097 -1.5560 -0.8246
N 2.8979 -0.2777 0.3226
H 1.2555 -1.0711 2.3543
H 0.3266 -2.2122 1.3666
H 2.0525 -2.4514 1.6103
H 0.8193 0.8445 -0.9811
H 0.6122 1.0718 0.7144
H -0.4400 0.4244 2.4204
H -2.0425 -0.1400 2.8563
H -3.0985 1.7209 1.5688
H -1.5098 2.3359 1.1312
H -2.0131 2.3425 2.8349
H 3.1017 0.3084 1.1257
H 3.4860 -1.1139 0.2817
H 3.0712 0.1760 -0.5761

【讨论】:

    【解决方案2】:

    您可以使用awkprintf 来获得对齐的列:

    awk '{ printf "%s %8s %9s %9s\n", $4, $1, $2, $3}' test.txt
    

    给出:

    C   1.2840   -1.6830    1.4460
    C   1.5660   -0.8240    0.2163
    C   0.5584    0.2995   -0.0595
    C  -0.8805   -0.1514   -0.2412
    O  -1.6205   -0.3785    0.8741
    C  -1.4770    0.3883    2.0816
    O  -1.3875   -0.2971   -1.3503
    C  -2.0561    1.7788    1.8987
    O   1.8097   -1.5560   -0.8246
    N   2.8979   -0.2777    0.3226
    H   1.2555   -1.0711    2.3543
    H   0.3266   -2.2122    1.3666
    H   2.0525   -2.4514    1.6103
    H   0.8193    0.8445   -0.9811
    H   0.6122    1.0718    0.7144
    H  -0.4400    0.4244    2.4204
    H  -2.0425   -0.1400    2.8563
    H  -3.0985    1.7209    1.5688
    H  -1.5098    2.3359    1.1312
    H  -2.0131    2.3425    2.8349
    H   3.1017    0.3084    1.1257
    H   3.4860   -1.1139    0.2817
    H   3.0712    0.1760   -0.5761
    

    【讨论】:

      【解决方案3】:

      使用 sed,您可以获取最后一个字符并将其放在首位

      sed "s/^\(.*\)\(.\)$/\2\1/g" /tmp/atom.txt
      
      C  1.2840   -1.6830    1.4460 
      C  1.5660   -0.8240    0.2163 
      C  0.5584    0.2995   -0.0595 
      C -0.8805   -0.1514   -0.2412 
      O -1.6205   -0.3785    0.8741 
      C -1.4770    0.3883    2.0816 
      O -1.3875   -0.2971   -1.3503 
      C -2.0561    1.7788    1.8987 
      O  1.8097   -1.5560   -0.8246 
      N  2.8979   -0.2777    0.3226 
      H  1.2555   -1.0711    2.3543 
      H  0.3266   -2.2122    1.3666 
      H  2.0525   -2.4514    1.6103 
      H  0.8193    0.8445   -0.9811 
      H  0.6122    1.0718    0.7144 
      H -0.4400    0.4244    2.4204 
      H -2.0425   -0.1400    2.8563 
      H -3.0985    1.7209    1.5688 
      H -1.5098    2.3359    1.1312 
      H -2.0131    2.3425    2.8349 
      H  3.1017    0.3084    1.1257 
      H  3.4860   -1.1139    0.2817 
      H  3.0712    0.1760   -0.5761 
      
      

      【讨论】:

        猜你喜欢
        • 2019-12-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2019-06-03
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多