【发布时间】:2014-02-03 22:49:24
【问题描述】:
我有以下测试文件
Kmax Event File - Text Format
1 4 1000
65 4121 9426 12312
56 4118 8882 12307
1273 4188 8217 12309
1291 4204 8233 12308
1329 4170 8225 12303
1341 4135 8207 12306
63 4108 8904 12300
60 4106 8897 12307
731 4108 8192 12306
...
ÿÿÿÿÿÿÿÿ
在这个文件中,我想删除前两行并应用一些数学计算。例如每一列i 将是$i-(i-1)*number。执行此操作的脚本如下
#!/bin/bash
if test $1 ; then
if [ -f $1.evnt ] ; then
rm -f $1.dat
sed -n '2p' $1.evnt | (read v1 v2 v3
for filename in $1*.evnt ; do
echo -e "Processing file $filename"
sed '$d' < $filename > $1_tmp
sed -i '/Kmax/d' $1_tmp
sed -i '/^'"$v1"' '"$v2"' /d' $1_tmp
cat $1_tmp >> $1.dat
done
v3=`wc -l $1.dat | awk '{print $1}' `
echo -e "$v1 $v2 $v3" > .$1.dat
rm -f $1_tmp)
else
echo -e "\a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo -e " Event file $1.evnt doesn't exist !!!!!!"
echo -e "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
fi
else
echo -e "\a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo -e "!!!!! Give name for event files !!!!!"
echo -e "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
fi
awk '{print $1, $2-4096, $3-(2*4096), $4-(3*4096)}' $1.dat >$1_Processed.dat
rm -f $1.dat
exit 0
文件不会总是有 4 列。有没有办法读取列数、打印此数字并应用这些计算?
EDIT 这个想法是有一个输入文件 (*.evnt),将其转换为 *.dat 或任何其他仅包含数字的 ascii 文件(实际上并不重要)在列中,然后应用计算$i=$i-(i-1)*number。此外,它将保留变量中的列数,该变量将在另一个程序中调用。例如在上面的文件中,number=4096 和一个示例输出文件如下
65 25 1234 24
56 22 690 19
1273 92 25 21
1291 108 41 20
1329 74 33 15
1341 39 15 18
63 12 712 12
60 10 705 19
731 12 0 18
在控制台中我会收到消息There are 4 detectors。
最后会生成一个新的file_processed.dat,其中file是awk输入文件的初始名称。
应该执行的方式如下
./myscript <filename>
其中<filename> 是不带格式的名称。例如,文件的格式为filename.evnt,所以应该使用
./myscript filename
【问题讨论】:
-
以上所有内容都可以在一个简短的 awk 脚本中完成。如果您根据您发布的示例输入文件向我们展示您的预期输出,我们可以为您提供帮助。我发布了一个答案,作为您尝试做的第一个猜测 - 看看并告诉我们它是否正确,如果不是,它需要做些什么不同的事情。
-
@EdMorton:请检查我编辑的问题!
-
好的,检查我编辑的答案,如果需要做任何不同的事情,请在该答案下方添加评论。