从子目录(bash、python)执行多个*.dat文件

从子目录(bash、python)执行多个*.dat文件,python,bash,shell,python-3.x,subdirectory,Python,Bash,Shell,Python 3.x,Subdirectory,我有以下资料: 我有一个包含子目录的目录,子目录中充满了文件。结构如下:/周期表/{Element}\ulj\u dat/lj\u dat\u sim.dat 每个文件由两行(第一行是注释)和12列数据组成 我想得到的是遍历元素的所有文件夹(如Al、Cu等),打开创建的文件(例如周期表目录中名为“mergedlj.dat”),并将每个文件中的所有数据存储在父目录中的一个添加元素名中,作为合并文件的第一(或最后)列 最好的方法是忽略每个文件中的第一行,只保存第二行的数据 我在bash/shell脚

我有以下资料:

  • 我有一个包含子目录的目录,子目录中充满了文件。结构如下:
    /周期表/{Element}\ulj\u dat/lj\u dat\u sim.dat
  • 每个文件由两行(第一行是注释)和12列数据组成
  • 我想得到的是遍历元素的所有文件夹(如Al、Cu等),打开创建的文件(例如
    周期表
    目录中名为“mergedlj.dat”),并将每个文件中的所有数据存储在父目录中的一个添加元素名中,作为合并文件的第一(或最后)列
  • 最好的方法是忽略每个文件中的第一行,只保存第二行的数据

    我在bash/shell脚本方面非常缺乏经验,但我认为这是最好的方法(Python也是可以接受的!)。不幸的是,我只有处理与脚本位于同一文件夹中的文件的经验,因此这对我来说是一些新的经验

    下面是查找此文件的代码,但实际上它并不能满足我的需要:

    find ../periodic_table/*_lj_dat/ -name lj_dat_sim.dat -print0 | while read -d $'\0' file; do 
        echo "Processing $file"
    done
    

    我们将非常感谢您的帮助

    这里有一个Python解决方案

    您可以使用获取匹配文件的列表,然后使用进行迭代
    fileinput.filename()
    可用于获取当前正在处理的文件的名称,并可用于在新文件开始处理时确定当前元素,如
    fileinput.isfirstline()
    所确定

    将当前元素添加为合并文件的第一列。我假设输入文件中的字段分隔符是一个空格,但您可以通过更改下面的
    '.join()
    来更改它

    import re
    import fileinput
    from glob import glob
    
    dir_prefix = '.'
    glob_pattern = '{}/periodic_table/*_lj_dat/lj_dat_sim.dat'.format(dir_prefix)
    element_pattern = re.compile(r'.*periodic_table/(.+)_lj_dat/lj_dat_sim.dat')
    
    with open('mergedlj.dat', 'w') as outfile:
        element = ''
        for line in fileinput.input(glob(glob_pattern)):
            if fileinput.isfirstline():
                # extract the element name from the file name
                element = element_pattern.match(fileinput.filename()).groups()[0]
            else:
                print(' '.join([element, line]), end='', file=outfile)
    

    您可以使用
    os.path.join()
    来构造glob和element regex模式,但为了避免混淆答案,我省略了上面的内容。

    看看python的
    os
    模块。它可以很好地引导您浏览目录树。是的,我对python的实现有一个想法,但我认为bash应该很简单(更短)。。。无论如何,谢谢,如果我用Python来做,我会把它贴在这里。谢谢你的回答!它起作用了,但我改变了以下内容:
    glob_pattern='{}/*\u lj_dat/lj_dat_sim.dat'.format(dir_prefix)
    element_pattern=re.compile(r'(.+)\u lj_dat/lj_dat_sim.dat'
    ,因为只要我把代码文件放在“周期表”目录中,代码就会循环。再次感谢!