【问题标题】:Getting blocks of strings between specific characters in text file "bash"获取文本文件“bash”中特定字符之间的字符串块
【发布时间】:2018-06-14 23:14:47
【问题描述】:

谁能帮我找到一个代码来复制字符串'X 0'(X = H,He...)和最近的'****'之间的所有字符串?我使用 bash 进行编程。

H 0
 S   3 1.00       0.000000000000
      0.1873113696D+02  0.3349460434D 01
      0.2825394365D+01  0.2347269535D+00
      0.6401216923D+00  0.8137573261D+00
 S   1 1.00       0.000000000000
      0.1612777588D+00  0.1000000000D+01
****
He 0
 S   3 1.00       0.000000000000
      0.3842163400D+02  0.4013973935D 01
      0.5778030000D+01  0.2612460970D+00
      0.1241774000D+01  0.7931846246D+00
 S   1 1.00       0.000000000000
      0.2979640000D+00  0.1000000000D+01
****

我想对所有“X 0”(X = H,He...)执行此操作,特别是,为所有“X 0”获取这样的孤立文本:

 H 0
 S   3 1.00       0.000000000000
      0.1873113696D+02  0.3349460434D 01
      0.2825394365D+01  0.2347269535D+00
      0.6401216923D+00  0.8137573261D+00
 S   1 1.00       0.000000000000
      0.1612777588D+00  0.1000000000D+01
****

 He 0
 S   3 1.00       0.000000000000
      0.3842163400D+02  0.4013973935D 01
      0.5778030000D+01  0.2612460970D+00
      0.1241774000D+01  0.7931846246D+00
 S   1 1.00       0.000000000000
      0.2979640000D+00  0.1000000000D+01
 ****

所以我想我必须找到一种方法来使用包含“X 0”的字符串。 我试图使用grep -A2000 'H 0' filename.txt | grep -B2000 -m8 '****' filename.txt >> filenameH.txt,但它对于 X 的其他示例没有那么有用,只是第一个。

【问题讨论】:

标签: bash awk sed grep


【解决方案1】:

使用awk

awk '/^[^ ]+ 0$/{p=1;++c}/^\*\*\*\*$/{print >>FILENAME c;p=0}p{print >> FILENAME c}' file

脚本创建的文件与匹配模式/^[^ ]+ 0$//^\*\*\*\*$/ 的块一样多。文件索引从 1 开始。

【讨论】:

    【解决方案2】:

    如果记录以 4 星分隔。需要gawk

    $ awk -v RS='\\*\\*\\*\\*\n' '$1~/^He?$/{printf "%s", $0 RT > FILENAME $1}' file
    

    这只会提取 HHe 记录。如果不想限制,只需去掉花括号前的条件即可。 (相当于$1=="H" || $1=="He"

    【讨论】:

      猜你喜欢
      • 2020-08-09
      • 1970-01-01
      • 2020-11-07
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      相关资源
      最近更新 更多