我想写一个帮助我完成工作的脚本。 问题:我在一个目录中有很多文件包含数据,我需要从新文件中复制的每个文件特定值。 数据文件看起来像这样:
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中的一行中获取数据。 任何人都可以帮助我吗?
答案 0 :(得分:2)
我认为你可以使用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
答案 1 :(得分:0)
尝试以下内容:
egrep "valueX|valueY" *.wt | awk -vRD="\n" -vORS=" " -F':| ' '{if (NR%2==0) {print $2, $3, $1} else {print $2, $3}}' > $file.new.txt
答案 2 :(得分:0)
#!/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
再次感谢你们。