我有以下内容:
/periodic_table/{Element}_lj_dat/lj_dat_sim.dat
; periodic_table
目录中命名为“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
任何帮助都将受到高度赞赏!!
答案 0 :(得分:0)
这是一个Python解决方案。
您可以使用glob()
获取匹配文件的列表,然后使用fileinput.input()
进行迭代。 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和元素正则表达式模式,但我已经省略了上述内容以避免混淆答案。