Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 多列数据的AWK后处理_Bash_Awk_Sed - Fatal编程技术网

Bash 多列数据的AWK后处理

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

我正在处理一行中包含多列信息的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 
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"