【问题标题】:AWK post-procession of multi-column data多列数据的AWK后处理
【发布时间】:2021-05-13 05:06:35
【问题描述】:

我正在处理包含一行中存在的多列信息的一组 txt 文件。在我的 bash 脚本中,我使用以下 AWK 表达式从每个 txt 填充中获取文件名以及第 5 列中的数字,并将其以 2 列格式保存在 results.CSV 文件中(通过管道传输到 SED,删除路径最终 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

以 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 文件的第一行:

# results.CSV
lig177| -0.1400 
lig331| -8.0000 
lig394| -4.3600 
lig420| -5.5200 
lig550| -4.3200 

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    基于管道的其余部分,我认为您想做这样的事情并摆脱 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 
    

    lig177
    

    模式替换是通用的

    /path/to/the/file/filename_otherstringshere...
    

    将只提取filename。从最后一个 / 字符到第一个 _ 字符。这是基于正则表达式模式的贪婪匹配。

    对于输出文件名,在 awk 调用之前更容易,因为它只有一行。

    $ echo "${experiment}.csv" > "${home}/${experiment}.csv"
    $ awk ... >> "${home}/${experiment}.csv"
    

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多