从文本文件中选择特定文本,BASH脚本

时间:2015-12-25 15:24:26

标签: bash text-extraction pbs

我一直在群集上运行模拟,我想通过遍历所有群集节点并复制我需要的所有文件来检查临时结果。

我一直在尝试做的是在输入qstat -rn u djsavic后从文本文件中提取作业ID和节点名称作为字符串:

fermi: 
                                                                               Req'd    Req'd      Elap
Job ID               Username    Queue    Jobname          SessID NDS   TSK    Memory   Time   S   Time
-------------------- ----------- -------- ---------------- ------ ----- ------ ------ -------- - --------
59281.fermi          djsavic     xlarge   Smith2            30676     1      2    --  96:00:00 R 24:19:14
    fermi-node08/1+fermi-node08/0
59282.fermi          djsavic     xlarge   Smith2            30686     1      2    --  96:00:00 R 24:18:56
    fermi-node08/3+fermi-node08/2
59283.fermi          djsavic     xlarge   Smith2            30700     1      2    --  96:00:00 R 24:18:56
    fermi-node08/5+fermi-node08/4
59284.fermi          djsavic     xlarge   Smith2            30729     1      2    --  96:00:00 R 24:21:09
    fermi-node08/7+fermi-node08/6
59285.fermi          djsavic     xlarge   Smith2             9076     1      2    --  96:00:00 R 24:19:24
    fermi-node07/1+fermi-node07/0
59286.fermi          djsavic     xlarge   Smith2             9078     1      2    --  96:00:00 R 24:19:23
    fermi-node07/3+fermi-node07/2
59287.fermi          djsavic     xlarge   Smith2             9079     1      2    --  96:00:00 R 24:19:41
    fermi-node07/5+fermi-node07/4
59288.fermi          djsavic     xlarge   Smith2             9080     1      2    --  96:00:00 R 24:19:57
    fermi-node07/7+fermi-node07/6

实际上,列表更长,大约80行。

我需要的是作业ID和节点名称,因此我可以复制文件,例如从目录fermi-node08/59281/到某些/location

经过大量的互联网搜索和搜索,到目前为止,我做了类似的事情:

for i in `qstat -rn -u djsavic`; do
    for j in `echo $i|grep fermi`; do
             echo $j|sed -r 's/(.{12}).*/\1/'|sed  's/.fermi//';
    done;
done

我得到的是这样一个列表:

fermi:
59281
fermi-node08
59282
fermi-node08
59283
fermi-node08
59284
fermi-node08
59285
fermi-node07
59286
fermi-node07
59287
fermi-node07
59288
fermi-node07

此时,我想将所有/fermi-node##/JobID/的文件复制到所需位置,并从列表顶部删除此fermi:。我是bash脚本的新手,如果有人能帮助我完成最后一步,我将非常感激。

提前致谢。

1 个答案:

答案 0 :(得分:1)

awk救援!

如果你的输入是那种形式(记录分为两行)和三个标题行,你可以用这个提取你需要的信息

$ awk 'NR>3{ if(!(NR%2)) {sub(".fermi","",$1); n=$1}
              else {sub("/.*","",$1); print $1"/"n}}' file

fermi-node08/59281
fermi-node08/59282
fermi-node08/59283
fermi-node08/59284
fermi-node07/59285
fermi-node07/59286
fermi-node07/59287
fermi-node07/59288

您可以在while循环中使用它进行进一步处理,例如

$ while read f; do echo $f; done < <(awk ...)

只需将echo $f替换为您想要做的事情。

更新:如果标题行没有固定,这可能会更健壮

$ awk '/^[0-9]*\.fermi/ {sub(".fermi","",$1); n=$1; next}
                       n{sub("/.*","",$1); print $1"/"n;n=""}' file