繁体   English   中英

bash脚本读取每个文件中的行,将特定值复制到newfile

[英]bash script reading lines in every file copying specific values to newfile

我想编写一个脚本来帮助我完成工作。 问题:我在一个包含数据的目录中有很多文件,并且我需要从每个文件中将特定值复制到新文件中。 数据文件如下所示:

Name   abc   $desV0
Start   MJD56669   opCMS v2
End   MJD56670   opCMS v2
...
valueX   0.0456   RV_gB
...
valueY   12063.23434 RV_gA
...          

脚本应该做的是将valueX和以下值以及valueY和以下值复制到一行中,并将其复制到新文件中。 然后在该行中添加源数据文件的名称。 此外,valueY的值应仅包含点之前的所有内容。 结果应如下所示:

valueX 0.0456 valueY 12063 name_of_sourcefile

我到目前为止:

for file in $(find -maxdepth 0 -type f -name *.wt); do
    for line in $(cat $file | grep -F vb); do
        cp $line >> file_done
    done
done

但这根本不起作用。 我也不知道如何在newfile的ONE行中获取数据。 谁能帮我?

我认为您可以使用awk大大简化脚本:

awk '/valueX/{x=$2}/valueY/{print "valueX",x,"valueY",$2,FILENAME}' *.wt > file_done

这遍历当前目录中的每个文件。 当匹配“ valueX”时,该值将保存到变量x 当匹配“ valueY”时,将打印该行。

假设包含“ valueX”的行始终位于包含“ valueY”的行之前。 如果这不是有效的假设,则可以轻松更改脚本。

要仅打印“ valueY”的整数部分,可以使用printf而不是print

awk '/valueX/{x=$2}/valueY/{printf "valueX %s valueY %d %s\n",x,$2,FILENAME}' *.wt > file_done

%d是整数的格式说明符。

如果您的要求更复杂,并且需要使用find ,则应使用-exec而不是循环搜索结果,以避免出现文件名笨拙的问题:

find -maxdepth 1 -iname "5*.par" ! -iname "*_*" -exec \
awk '/valueX/{x=$2}/valueY/{printf "valueX %s valueY %d %s\n",x,$2,"{}"}' '{}' \; > file_done

尝试如下所示:

egrep "valueX|valueY" *.wt | awk -vRD="\n" -vORS=" " -F':| ' '{if (NR%2==0) {print $2, $3, $1} else {print $2, $3}}' > $file.new.txt

不要打架 非常感谢您的帮助,尤其是快速的答复。 我认为这是我的最终解决方案:

#!/bin/bash

for file in $(find * -maxdepth 1 -iname "5*.par" ! -iname "*_*"); do
awk '/TASC/{x=$2}/START/{printf "TASC %s MJD %d %s",x,$2, FILENAME}' $file > mjd_vs_tasc
done

再次非常感谢你们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM