24小时热门版块排行榜    

查看: 717  |  回复: 8

zhangyujin

铜虫 (正式写手)

[求助] 怎样拣出一系列文档中每个文档第二列的最大值

我的程序运行出来结果是这样存放的:一个主文件夹下有十个子文件夹名字各不相同1、2、3、4……,每个子文件夹下有三十个.dat文档名字也不相同(z_0_E_t.dat/z_2_E_t.dat……),每个文档中有两列数据,每列有55602行。我需要把每个子文件夹中z_0_E_t.dat和z_2_E_t.dat中第二列的最大值求出来,然后把这些最大值放在一个文档中输出来,输出格式是二列,第一列存放的是十个子文件夹每个文件夹中的z_0_E_t.dat文档的第二列的最大值,第二列存放的是十个子文件夹每个文件夹中的z_2_E_t.dat文档的第二列的最大值。哪位高手能编写个小程序实现这个功能?什么语言都可以。感激不尽啊。
回复此楼
Hardworking!!
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

liuhuisfp

金虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
jjdg: 金币+1, 感谢参与 2013-03-02 14:13:23
zhangyujin: 金币+10, 有帮助, 这样出来的不是按照顺序排列的呢 显示出来的数据有大有小 没什么规律 2013-03-02 21:03:29
cut -d\' \' -f 2 youfile | sort |tail

记不清这几个命令的参数了,如果不对看下帮助

基本方法是:
利用管道

cut的-d指定列与列间的分隔符,-f指定你要的列
sort将数据排序,排序貌似是升序,如果不对,加参数要求按数值或字符排
tail取最后10个

[ 发自手机版 http://muchong.com/3g ]
2楼2013-03-02 11:18:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jjdg

版主 (知名作家)

优秀版主

【答案】应助回帖

感谢参与,应助指数 +1
你说的这么复杂,把你的文件贴出来看看
原始文件以及想要生成的目标文件都贴出来,这种文件处理的编程需要看过文件后才能确定。
还有,z_0_E_t.dat和z_2_E_t.dat的名字是固定的,还是你随便写的,或者在各个文件夹里面仍有变化。
这些问题都要说明清楚。
努力学习!以正当途径!获得需要的知识!
3楼2013-03-02 14:19:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhangyujin

铜虫 (正式写手)

如图,Result文件夹下有1.f90.out-10.f90.out个子文件夹,每个子文件夹下有若干个.dat文件(输出文件是文本文档,图片中的显示有问题,应该是写字板的图标),右侧是文本文档中的内容,我需要把第二列的数据的最大值寻出来。

_{}F4OG1Q1W7R~Z@6(G~LTV.jpg

Hardworking!!
4楼2013-03-02 15:41:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

haixiawu

金虫 (文坛精英)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
zhangyujin: 金币+30, ★★★很有帮助, 脚本很好,但是我们这边的集群是每个人一个账户,所以提交脚本时还要做一些修改,我调了好久还是有错误,不知道能不能麻烦你在帮忙看看 2013-03-02 19:57:46
使用bash脚本来做,请在linux或mac下执行。请在主文件夹下执行。
vim test.sh
### start of script
#!/bin/bash

for d in `ls -d -- */`; do
    cat $d/z_0_E_t.dat | awk '{print $2}' | sort -r | sed -n '1p' >> tmp
    cat $d/z_2_E_t.dat | awk '{print $2}' | sort -r | sed -n '1p' >> tmp
done

sed 'N;s/\n/ /' tmp > final.txt
### end of script
5楼2013-03-02 15:46:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

haixiawu

金虫 (文坛精英)

【答案】应助回帖

python version: 可在windows下运行。

#start of script
#!/usr/bin/env python

def GetMax(fs):
   f = open(fs, "r"
   max = 0
   for line in f.readlines():
      v = line.split()[1]
      if v > max:
          max = v
   f.close()
   return max

if __name__ == "__main__":
   m1 = []
   m2 = []
   import sys
   main_dir= sys.argv[1]
   f = open("result.txt", "w+"
   for i in range(1, 11):
       m1 = GetMax("%s/%d.f90.out/z_0_E_t.dat"%(main_dir, i))
       m2 = GetMax("%s/%d.f90.out/z_2_E_t.dat"%(main_dir, i))
       f.write("%d %d\n"%(m1, m2))
   f.close()
#end of script
运行方法:在命令行下运行
python process.py "C:/"
6楼2013-03-02 16:17:23
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

haixiawu

金虫 (文坛精英)

【答案】应助回帖

引用回帖:
5楼: Originally posted by haixiawu at 2013-03-02 15:46:33
使用bash脚本来做,请在linux或mac下执行。请在主文件夹下执行。
vim test.sh
### start of script
#!/bin/bash

for d in `ls -d -- */`; do
    cat $d/z_0_E_t.dat | awk '{print $2}' | sort -r | sed -n ...

有什么问题,你得说出来我才好改。
7楼2013-03-03 01:42:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhangyujin

铜虫 (正式写手)

引用回帖:
7楼: Originally posted by haixiawu at 2013-03-03 01:42:50
有什么问题,你得说出来我才好改。...

我们的集群是每个人一个账户,统一管理的,所以提交任务需要先建立一个临时目录,、计算相关信息存放在临时目录里,计算完了再删掉。下面的脚本是一个可执行的脚本,实现的是把bin文件夹里的若干个程序一起提交,按照顺序一个个的执行。我想把你给的那个寻找最大值并且输出的脚本嫁接到这个可执行的脚本上来,这样才可以用,但是改了很多地方都有问题,没有final.txt产生。因为刚接触linux语言,还不是太灵活,可能是我遗漏了需要改动的地方,麻烦你帮忙看一下怎么嫁接这两个脚本。

#!/bin/sh
#PBS -N Others
#PBS -l nodes=1:ppn=1
#PBS -l walltime=200:00:00
#PBS -q OTHERS
#PBS -j oe

NPROCS=`wc -l < $PBS_NODEFILE`

mkdir -p /tmp/$PBS_JOBID

cp -r $PBS_O_WORKDIR/* /tmp/$PBS_JOBID

cd /tmp/$PBS_JOBID

for ExeFile in $(ls /tmp/$PBS_JOBID/bin)

do
         mkdir -p /tmp/$PBS_JOBID/Result/$ExeFile.out
     
         cp /tmp/$PBS_JOBID/bin/$ExeFile /tmp/$PBS_JOBID/Result/$ExeFile.out
         
         cd /tmp/$PBS_JOBID/Result/$ExeFile.out
         
         ifort $ExeFile
         
         /tmp/$PBS_JOBID/Result/$ExeFile.out/a.out
         
done


cp -r /tmp/$PBS_JOBID/* $PBS_O_WORKDIR

rm -rf /tmp/$PBS_JOBID
Hardworking!!
8楼2013-03-03 09:24:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

haixiawu

金虫 (文坛精英)

【答案】应助回帖

引用回帖:
8楼: Originally posted by zhangyujin at 2013-03-03 09:24:18
我们的集群是每个人一个账户,统一管理的,所以提交任务需要先建立一个临时目录,、计算相关信息存放在临时目录里,计算完了再删掉。下面的脚本是一个可执行的脚本,实现的是把bin文件夹里的若干个程序一起提交,按 ...

首先目录结构:
$PBS_O_WORKDIR
      +--- bin
       |       +---test.sh
      +-- data
              +---1.f90.out
                       +--- xxx.dat
                       +--- ...
              +---2.f90.out
              +....

vim test.sh
### start of script
#!/bin/bash
cd ../data
for d in `ls -d -- */`; do
    cat $d/z_0_E_t.dat | awk '{print $2}' | sort -r | sed -n '1p' >> tmp
    cat $d/z_2_E_t.dat | awk '{print $2}' | sort -r | sed -n '1p' >> tmp
done

sed 'N;s/\n/ /' tmp > final.txt
### end of script
9楼2013-03-03 10:33:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zhangyujin 的主题更新
信息提示
请填处理意见