【问题标题】:bash extracting the first line from the table [duplicate]bash从表中提取第一行[重复]
【发布时间】:2020-09-30 15:06:26
【问题描述】:

关于表模式日志文件威胁的第二个问题。我正在处理位于 workdir 中的大量 dlg 文本文件的分析。每个文件都有一个表格(通常位于日志末尾),格式如下:

 RMSD TABLE
    __________


_____________________________________________________________________
     |      |      |           |         |                 |
Rank | Sub- | Run  | Binding   | Cluster | Reference       | Grep
     | Rank |      | Energy    | RMSD    | RMSD            | Pattern
_____|______|______|___________|_________|_________________|___________
   1      1      7       -1.43      0.00    178.12           RANKING
   1      2     18       -0.96      1.88    177.35           RANKING
   2      1      4       -0.97      0.00    178.43           RANKING
   3      1     13       -0.60      0.00    178.03           RANKING
   4      1      5       -0.56      0.00    198.10           RANKING
   5      1     16       +0.01      0.00    189.71           RANKING
   6      1      3       +0.06      0.00    176.95           RANKING
   7      1     19       +0.10      0.00    177.27           RANKING
   8      1     17       +0.13      0.00    177.60           RANKING
   9      1      8       +0.20      0.00    177.05           RANKING
  10      1     20       +0.27      0.00    177.43           RANKING
  11      1     10       +0.34      0.00    176.33           RANKING
  12      1      6       +0.37      0.00    177.30           RANKING
  13      1      9       +0.44      0.00    175.48           RANKING
  14      1      2       +0.46      0.00    175.67           RANKING
  15      1     11       +0.84      0.00    177.52           RANKING
  15      2     12       +1.31      1.95    178.03           RANKING
  16      1     14       +1.29      0.00    201.01           RANKING
  17      1     15       +1.65      0.00    175.50           RANKING
  18      1      1       +1.96      0.00    186.83           RANKING

Run time 3.909 sec
Idle time 0.817 sec

目的是遍历所有 .dlg 文件并从表中取出与其第一行相对应的单行(忽略标题),省略最后一列(通常用于 grep 识别)。在上面的表格示例中,这是第三行。

      1      1      7       -1.43      0.00    178.12

然后我需要将这一行与日志文件的名称(应该在之前指定)一起添加到 final_log.txt 中。 根据我最近的经验,我的 BASH 工作流程(用于威胁多个文件)的可能模型可能是:

#!/bin/bash
#name of the folder containing all *.dlg filles to be analysed
prot='7000'
#path to the folder with these *.dlg filles
FILES=$PWD/${prot}/*.dlg
#make a final log
echo 'This is a list of processed filles' > $PWD/final_results.log
# we loop over all *.dlg filles in order to extract Clustering Histogram to the final LOG file
for f in $FILES
do
  file_name2=$(basename "$f")
  file_name="${file_name2/.dlg}"
  echo "Processing of $f..."
  # here is an expression for GREP to take the line from the table and save it to >> $PWD/final_results.log
done

【问题讨论】:

  • 这显然是stackoverflow.com/questions/64123229/…之后的后续问题(输入略有不同)
  • 如果输入文件前面有不相关的行,我们可以假设没有一个数字开头,和/或它们都没有以RANKING结尾吗?无论哪种方式,如果这是一项重要要求,可能会更加明确。
  • "${file_name2/.dlg}" 看起来像一个错字,你的意思是"${file_name2%.dlg}" 修剪掉扩展名,也许?一般而言,没有做你想做的事情的代码是一种糟糕的方式来解释你想做的事情。
  • 你好,是的,对于相同类型的输入数据(带有日志的txt文件),这与我已经问过的问题非常相似。抱歉打错了,是的,实际上我使用这个命令来触发文件的扩展名(如果它是必要的)。简而言之,我正在寻找一个简单的单行命令,可以在循环中引入(它处理工作目录中的填充)来查看 DLG 文本文件并从另一个表中提取第一行(通常发生在末尾)日志)...
  • 如果您拒绝回答澄清请求,您可能会面临被否决和/或问题被关闭的风险。 vgersh99 的答案是否合适,或者您是否有阻止它工作的隐藏要求?正确地说,您应该再次接受您实际提出的问题的答案,然后如果您现在有不同的要求,请发布一个新问题。

标签: bash grep


【解决方案1】:

如何开始 - 假设 gawk 支持 nextfile:

gawk '$1~/[[:digit:]]/{ print FILENAME, substr($0,1,match($0,/[[:blank:]]+[^[:blank:]]+$/)-1);nextfile}' *.dlg

【讨论】:

  • 这假设以数字开头的第一行是我们寻找的行。我们可以假设文件前面没有具有此功能的行吗?
  • 嘿,我喜欢你优雅的解决方案,但它宁愿从另一个表中取线,它发生在第二个表之前(在我的第一个主题中提到):-))对不起,我忘了提到在 DLG 文件中有两个格式相似的表格,我应该使用第二个表格(通常在文件末尾)进行操作。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2018-11-19
  • 2022-01-15
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 2016-12-10
相关资源
最近更新 更多