从txt中获取基于列的信息的Awk解决方案



使用bash-shell,我正在分析位于同一目录中的大量txt文件。

每个txt文件共享相同的格式:

largestCl_dlgfn #runs #cl #LC #LE_LC #rmsd_LC #ats #tors #h_ats #lig_eff 
/Users/fox/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig1000/7000_08_lig_cne_1000,240,206,  5, -5.3000, 238.4025,  22, 4, 1,  0.0000

largestCl_dlgfn #runs #cl #LC #LE_LC #rmsd_LC #ats #tors #h_ats #lig_eff
/Users/fox/Desktop/DOcking/clusterizator/sub_folders_to_analyse/7000_CNE_lig1001/7000_04_lig_cne_1001,240, 56, 26, -5.2900, 206.1682,  13, 1, 1,  0.0000

我需要编写一个简单的shell脚本,适用于循环所有日志文件,获取文件名以及从日志第二行的第4列和第6列提取(例如使用Awk(数字。所有三个实体都应该使用final_output.txt中的|来分隔(每次循环时都应该更新,同时添加与每个处理的文本对应的新行(。

上述日志的预期输出应为一行

name_of_the_log.log| -5.6800| 15

对于N个日志,final_output显然应该包含总是相同格式的N行。

在处理许多日志的分析时,bash工作流可以采用以下格式:

#!/bin/bash
logs=$PWD/tmp/*.txt
for f in $logs; do
# take the name of the file and subtract its extension
file_name=$(basename "$f")
file_name="${file_name/.txt}"
echo "Processing of $f..."
#example of Awk solution which does not always match correctly the proper column
awk '-F, *' '{if(NR==2) printf("%s| %s| %sn", FILENAME,$5,$7) }' ${f} >> final_log.txt
done

您可以一次处理所有文件:

awk '-F, ' '{if(FNR==2) printf("%s| %s| %sn", FILENAME,$4,$6) }' *.txt

混合,,分离柱的替代方案:

awk '-F, *' '{if(FNR==2) printf("%s| %s| %sn", FILENAME,$5,$7) }' *.txt

要删除文件的路径:

awk '-F, *' '{if(FNR==2){sub(".*/","",FILENAME);printf("%s| %s| %sn",FILENAME,$5,$7)}}' *.txt

或者先更改目录:

#!/bin/bash
process() {
OD=$PWD
cd tmp
awk '-F, *' '{if(FNR==2) printf("%s| %s| %sn", FILENAME,$5,$7) }' *.txt
cd "$OD"
}
process > result.txt