Bash 多列数据的AWK后处理
我正在处理一行中包含多列信息的txt文件集。在我的bash脚本中,我使用以下AWK表达式从每个txt填充中获取文件名以及第5列中的数字,并将其以2列格式保存在results.CSV文件中(通过管道传输到SED,从最终的CSV文件中删除文件路径及其扩展名): 获取CSV格式的内容(用于5个txt填充):Bash 多列数据的AWK后处理,bash,awk,sed,Bash,Awk,Sed,我正在处理一行中包含多列信息的txt文件集。在我的bash脚本中,我使用以下AWK表达式从每个txt填充中获取文件名以及第5列中的数字,并将其以2列格式保存在results.CSV文件中(通过管道传输到SED,从最终的CSV文件中删除文件路径及其扩展名): 获取CSV格式的内容(用于5个txt填充): lig177_cl_5.2| -0.1400 lig331_cl_3.5| -8.0000 lig394_cl_1.9| -4.3600 lig420_cl_3.8| -5.5200 li
lig177_cl_5.2| -0.1400
lig331_cl_3.5| -8.0000
lig394_cl_1.9| -4.3600
lig420_cl_3.8| -5.5200
lig550_cl_2.0| -4.3200
如何修改我的AWK表达式,以便从每个txt文件的名称中排除“_cl_x.x”,并将CSV的名称作为注释添加到生成的CSV文件的第一行:
awk '-F, *' '{if(FNR==2) printf("%s| %s \n", FILENAME,$5) }' ${tmp}/*.txt | sed 's|\/Users/gleb/Desktop/scripts/clusterizator/tmp/||; s|\.txt||' >> ${home}/"${experiment}".csv
# results.CSV
lig177| -0.1400
lig331| -8.0000
lig394| -4.3600
lig420| -5.5200
lig550| -4.3200
基于管道的其余部分,我认为您希望这样做,并摆脱
sed
调用
awk -F', *' 'FNR==2 {f=FILENAME;
sub(/.*\//,"",f);
sub(/_.*/ ,"",f);
printf("%s| %s\n", f, $5) }' "${tmp}"/*.txt >> "${home}/${experiment}.csv"
这将转换为
/Users/gleb/Desktop/scripts/clusterizator/tmp/lig177_cl_5.2.txt
到
模式替换是通用的
/path/to/the/file/filename_otherstringshere...
将仅提取文件名
。从最后一个字符到第一个字符。这是基于正则表达式模式的贪婪匹配
对于输出文件名,在awk调用之前更容易执行,因为它只是一行
$ echo "${experiment}.csv" > "${home}/${experiment}.csv"
$ awk ... >> "${home}/${experiment}.csv"
基于管道的其余部分,我认为您希望这样做,并摆脱
sed
调用
awk -F', *' 'FNR==2 {f=FILENAME;
sub(/.*\//,"",f);
sub(/_.*/ ,"",f);
printf("%s| %s\n", f, $5) }' "${tmp}"/*.txt >> "${home}/${experiment}.csv"
这将转换为
/Users/gleb/Desktop/scripts/clusterizator/tmp/lig177_cl_5.2.txt
到
模式替换是通用的
/path/to/the/file/filename_otherstringshere...
将仅提取文件名
。从最后一个字符到第一个字符。这是基于正则表达式模式的贪婪匹配
对于输出文件名,在awk调用之前更容易执行,因为它只是一行
$ echo "${experiment}.csv" > "${home}/${experiment}.csv"
$ awk ... >> "${home}/${experiment}.csv"