从列表中提取字符串匹配文件

如何解决从列表中提取字符串匹配文件

我有一个名为file.out的列表,其中包含如下所示的文件:

file                                                            a    b    c    d   e
DS_swe/msg.rti-20160510_5_1.0_rnt.txt-20190415_8_2.0_rnt.txt  0.5  1.0  1.5  1.3 2.0
DS_swe/msg.rti-20105510_5_1.0_rnt.txt-20200415_8_2.0_rnt.txt  0.6  2.0  2.5  1.2 4.0
DS_swe/msg.rti-20190510_5_1.0_rnt.txt-20250415_8_2.0_rnt.txt  0.2  8.0  3.5  1.1 6.0
DS_swe/msg.rti-20102510_5_1.0_rnt.txt-20240415_8_2.0_rnt.txt  0.1  2.5  1.2  1.0 8.0
DS_swe/msg.rti-20145510_5_1.0_rnt.txt-20140415_8_2.0_rnt.txt  0.8  2.2  1.4  1.9 5.0

我还有一个名为data的目录,其中包含类似文件

data/
├── 20160510_5_1.0_rnt.txt
├── 20105510_5_1.0_rnt.txt
├── 20190510_5_1.0_rnt.txt
├── 20102510_5_1.0_rnt.txt
└── 20145510_5_1.0_rnt.txt

这些文件名与上面列出的数据部分的一部分匹配,例如:

DS_swe/msg.rti-????????_?_?_???.???-20190415_8_2.0_rnt.txt 0.5  1.0  1.5  1.3 2.0.

加上目录中的所有.txt文件都包含4行,如下所示。例如20160510_5_1.0_rnt.txt包含:

20.0  23.0  25.0  45.0  78.0  sy
14.0  12.0  24.0  45.0  78.0  tx
14.0  25.0  25.0  47.0  78.0  mx
12.0  25.0  32.0  47.0  56.0  cx

所以我要做的是:如果目录中的files(.txt)与上面列表::中标记为?的字符串匹配::,那么我想从匹配的.txt中提取第3和第4列目录中存在文件,并且还希望提取列表(file.out)中相应文件的第5和第6列值,并希望在相应的.txt内附加相同第5和第6列值的重复值文件,最后想将相同的.txt文件保存在名为results的不同目录中

例如:文件20160510_5_1.0_rnt.txt的预期输出如下

25.0  45.0  1.3  2.0
24.0  45.0  1.3  2.0
25.0  47.0  1.3  2.0
32.0  47.0  1.3  2.0

为解决上述问题,我尝试了以下代码,但停留在需要专家帮助的主要部分。

#!/bin/sh
for file in /home/lijun/data/*.txt
    grep "*.txt" file.out > file
    cat file | if 

解决方法

已更新,其中包括基于OP示例for循环的输入/输出文件目录


一个(有点)冗长的解决方案...

使用awkfile.out中提取文件名和字段5和6:

$ awk '{ split($1,fn,"-"); print fn[2],$5,$6 }' file.out
20160510_5_1.0_rnt.txt 1.3 2.0
20105510_5_1.0_rnt.txt 1.2 4.0
20190510_5_1.0_rnt.txt 1.1 6.0
20102510_5_1.0_rnt.txt 1.0 8.0
20145510_5_1.0_rnt.txt 1.9 5.0

位置:

  • 使用默认的空白输入字段分隔符
  • split($1,"-")-使用fn作为字段分隔符,将第一个字段分成数组"-"
  • print fn[2],$6-输出文件名和字段5和6

我们现在将使用第二个awk解决方案遍历此列表,以从文件中提取字段3和4并追加字段5和6(来自file.out):

# OP will need to update the following variables to ensure they reference the correct directory where the input/output files are located:

$ in_dir="/home/lijun/data"
$ out_dir="/home/lijun/results"

$ while read -r fname field5 field6
do
    # I only have one file in my system so I'll print a warning about files I can't find
  
    [ ! -f "${in_dir}/${fname}" ]                                         && \
    echo "WARNING: Unable to locate file '${in_dir}/${fname}'. Skipping." && \
    continue

    echo "Processing file '${in_dir}/${fname}' ..."

    # pass fields 5 & 6 into `awk` using `-v`; print out desired fields

    awk -v f5="${field5}" -v f6="${field6}" '{ print $3,$4,f5,f6 }' "${in_dir}/${fname}" > "${out_dir}/${fname}"

done < <(awk '{ split($1,$6 }' file.out)

在我的系统上运行以上代码会生成:

Processing file '20160510_5_1.0_rnt.txt' ...
WARNING: Unable to locate file '20105510_5_1.0_rnt.txt'. Skipping.
WARNING: Unable to locate file '20190510_5_1.0_rnt.txt'. Skipping.
WARNING: Unable to locate file '20102510_5_1.0_rnt.txt'. Skipping.
WARNING: Unable to locate file '20145510_5_1.0_rnt.txt'. Skipping.

$ cat 20160510_5_1.0_rnt.txt.2
25.0 45.0 1.3 2.0
24.0 45.0 1.3 2.0
25.0 47.0 1.3 2.0
32.0 47.0 1.3 2.0
,

您可以使用第一个awk解析file.out以获取第一列与以下 regex 模式匹配的所有行:

/DS_swe\/msg.rti-(.+)-[0-9]{8}_[0-9]_[0-9].[0-9]_rnt.txt/

在这里,(.+)捕获文件名并将其存储到\1中。

因此要运行的awk行将是:

awk '{
       # Replace the first column with only the related filename in datas
       # and store it in f.
       f=gensub(/DS_swe\/msg.rti-(.+)-[0-9]{8}_[0-9]_[0-9].[0-9]_rnt.txt/,"\\1","1",$1)
       # If the value doesn't match the pattern,f will contain the column value
       # So don't print anything.
       if  (f != $1) print f" "$5" "$6
     } < file.out'

您将获得以下内容:

20160510_5_1.0_rnt.txt 1.3 2.0

然后使用read获取每个列的值:

read f c5 c6 # stores the filename in $f,the 5th column in $c5,the 6th in $c6

至少,使用这些值运行另一个awk:

# Parse data/"$f" file and for each line
# print the 3rd and 4th columns with "$c5 $c6" text
awk '{ print $3" "$4" '"$c5 $c6"'" }' <data/$f

然后您可以通过第二个awk调用来处理输出:

最终工作示例(&&代表逻辑AND;如果读取没有遇到文件结尾,则运行以下命令):

awk '{
       f=gensub(/DS_swe\/msg.rti-(.+)-[0-9]{8}_[0-9]_[0-9].[0-9]_rnt.txt/,$1)
       if  (f != $1) print f" "$5" "$6
      }' < file.out | {
                        read f c5 c6 &&
                        awk '{ print $3" "$4" '"$c5 $c6"'" }' <data/$f ;
                      }

结果:

25.0 45.0 1.3 2.0
24.0 45.0 1.3 2.0
25.0 47.0 1.3 2.0
32.0 47.0 1.3 2.0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-