python递归列文件_python-Bash:从最大列递归地向文件写入一行
回到my previous question,我發現問題并沒有完全解決.這是問題所在:
我有名為RUN1,RUN2和RUN3的目錄
每個目錄都有一些文件.目錄RUN1具有文件mod1_1.csv,mod1_2.csv,mod1_3.csv.目錄RUN2具有文件mod2_1.csv,mod2_2.csv,mod3_3.csv等.
mod1_1.csv文件的內容如下所示:
5.71 6.66 5.52 6.90
5.78 6.69 5.55 6.98
5.77 6.63 5.73 6.91
而mod1_2.csv看起來像這樣:
5.73 6.43 5.76 6.57
5.79 6.20 5.10 7.01
5.71 6.21 5.34 6.81
在RUN2中,mod2_1.csv如下所示:
5.72 6.29 5.39 5.59
5.71 6.10 5.10 7.34
5.70 6.23 5.23 6.45
并且mod2_2.csv看起來像這樣:
5.72 6.29 5.39 5.69
5.71 6.10 5.10 7.32
5.70 6.23 5.23 6.21
我的目標是為每個RUN *目錄獲取第4列的最小值的行,并將其和將其寫入新的.csv文件的模型寫入.現在,我有以下代碼:
#!/bin/bash
resultfile="best_results_mlp_2.txt"
for d in $(find . -type d -name 'RUN*' | sort);
do
find $d -type f -name 'mod*' -exec sort -k4 {} -g \; | head -1 >> "$resultfile"
done
但是它并不總是返回第4列的最小值(我瀏覽了文件并進行了檢查),并且不包括包含最小數字的文件名.為了澄清,我想要一個包含以下內容的.csv文件:
5.73 6.43 5.76 6.57 mod1_2.csv
5.72 6.29 5.39 5.59 mod2_1.csv
解決方法:
如果要從所有文件中獲取最小值,則必須立即對所有內容進行排序.該命令當前按文件對文件進行排序,因此您將在第一個排序的文件中獲得最小值.
檢查之間的區別
find "$d" -type f -name 'mod*' -exec sort -k4 -g {} +
和
find "$d" -type f -name 'mod*' -exec sort -k4 -g {} \;
另外,除非確實需要,否則建議使用-n而不是-g.
查看信息coreutils的“一般調用”的–general-numeric-sort部分,以獲取更多詳細信息.
編輯:剛剛檢查了您以前的問題的鏈接,現在我看到您需要使用–general-numeric-sort
就是說,這是一種將相應文件名放入各行中的方法,以便在輸出中使用它:
find "$d" -type f -name 'mod*' -exec awk '{print $0, FILENAME}' {} \;|sort -k4 -g |head -1 >> "$resultfile"
本質上,awk是分別為每個文件調用的. Awk打印文件的每一行,并在其后附加相應的文件名.然后將所有這些行傳遞進行排序.
注意:上面的代碼將打印文件名及其找到文件的路徑.如果您只想獲取文件的基本名稱,則可以改用以下awk命令(其余與上面相同):
awk 'FNR==1{ cnt=split(FILENAME, arr, "/"); basename=arr[cnt] } { print $0, basename}'
標簽:python,bash
總結
以上是生活随笔為你收集整理的python递归列文件_python-Bash:从最大列递归地向文件写入一行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是jsp的内置对象?
- 下一篇: python像素处理_Python+Op