[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 请教批量处理特定字符内容数值带文件名排序问题

请教一个问题:一个文件夹中有一些文件aaaa、bbbb等,每个文件内容中都有几个(\VR=数值\)这样的形式,如下图:

我的目的是将这些文件从后往前数,第一次出现的(\VR=数值\)中的数值进行排序,最重要的是要显示这些数值来自的文件名,目标如下图:

想通过一些简单的命令如:for循环 ,grep, awk,  sed, sort等组合来解决 。这个问题不容易解决,谢谢大家!!!!
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

批处理,还是shell。不要混淆!

TOP

把原文件打包上来看看!

TOP

回复 3# Gin_Q
非常感谢关注,我即刻上传文件。

TOP

非常感谢你的关注。我帖子之前说的比较繁琐,我已将问题替换为:有个文件夹下由aaa、bbbb、cccc.....等文件。这些文件内容中都不只一次出现VOL Sert:并在其所在的行出现唯一等号= 。等号后空两格有一串数值,这个数值小数点不一定在哪,但都是由12个数字、一个小数点.、一个负号-组成。请见附件aaaa、bbbb、cccc。我的目的是想用sed、for、awk、 sort等组合命令将每个文件倒数第一个VOL Sert:这行等号后的这个数值提取从小到大排序,最重要的是显示每个数值来自的文件名。请见附件jieguo。这个问题好久都没解决,可能有点难,非常感谢!!!谢谢!!!



附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

回复 4# dingniu2
专家,问题的新描述以及相关txt文件已上传,感谢!!!

TOP

本帖最后由 Gin_Q 于 2020-3-21 13:02 编辑
  1. #!/bin/bash
  2. rm -f result.txt result1.txt 2>/dev/null
  3. for a in `ls *.txt`
  4. do
  5. grep -o -E "\-[0-9]{1,12}.[0-9]{1,12}" $a | awk -v fname=$a '{printf "%s %s\n",fname,$1}' 1>>result1.txt
  6. done
  7. sort -nr -t ' ' -k 2 result1.txt 1>result.txt
  8. rm -f result1.txt
复制代码
  1. cccc.txt -5.65679881107
  2. cccc.txt -23.8882046924
  3. aaaa.txt -56.5589881107
  4. bbbb.txt -268.882046924
  5. aaaa.txt -2603.82046924
  6. bbbb.txt -5655.89881107
复制代码

TOP

回复 7# Gin_Q
高手,多谢!!!还有一个难点,就是如何只排列每个文件倒数第一个VOL Sert:这行等号后的这个数值?不要除倒数第一个数值以外的其它值?就差这一步,万分感谢!!!!

TOP

Gin_Q 发表于 2020-3-21 11:45

大神,还是不行,我发了3个待处理文件,其它文件也都有VOL Sert:行,对这行规律都一样,但是行间可能有其它干扰行,也就是VOL Sert:行不确定出现在哪行,我以为编写脚本可以寻找VOL Sert:行的=后空两格的数?我发了更具特殊性的dddd,请大神帮忙取倒数第一个VOL Sert:行对应的数值排序。这个还是有难度,万分感谢!!!
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

还有一个难点我没有明白你的意思!
  1. #!/bin/bash
  2. rm -f result.txt result1.txt 2>/dev/null
  3. for a in `ls *.txt`
  4. do
  5. grep -o -E "[[:space:]]{2}-[0-9]{1,12}.[0-9]{1,12}[[:space:]]{2}" $a | awk -v fname=$a '{printf "%s %s\n",fname,$1}' 1>>result1.txt
  6. done
  7. sort -nr -t ' ' -k 2 result1.txt 1>result.txt
  8. rm -f result1.txt
复制代码
  1. cccc.txt -5.65679881107
  2. dddd.txt -9.63598741107
  3. cccc.txt -23.8882046924
  4. aaaa.txt -56.5589881107
  5. dddd.txt -65.8839646924
  6. bbbb.txt -268.882046924
  7. aaaa.txt -2603.82046924
  8. bbbb.txt -5655.89881107
复制代码

TOP

回复 10# Gin_Q
谢谢大神回复,还有一个难点问题没解决,就是只要对每个文件倒数第一个VOL Sert:后那个数值排序,大神你的脚本是对所有VOL Sert:后那个数值排序,我尝试改你的脚本但没成功,请大神赐教,万分感谢!!!!

TOP

本帖最后由 Gin_Q 于 2020-3-21 15:12 编辑

我对shell了解不多,你应该多学学linux三剑客
排序文本最后一次匹配到的数据
  1. #!/bin/bash
  2. rm -f result.txt result1.txt 2>/dev/null
  3. for a in `ls *.txt`
  4. do
  5. for b in `grep -o -E "[[:space:]]{2}-[0-9]{1,12}.[0-9]{1,12}[[:space:]]{2}" $a`
  6. do
  7. temp=$b
  8. done
  9. echo $temp |awk -v fname=$a '{printf "%s %s\n",fname,$1}' 1>>result1.txt
  10. done
  11. sort -nr -t ' ' -k 2 result1.txt 1>result.txt
  12. rm -f result1.txt
  13. #grep -o -E "[[:space:]]{2}-[0-9]{1,12}.[0-9]{1,12}[[:space:]]{2}" $a | tac n 1 |awk -v fname=$a '{printf "%s %s\n",fname,$1}' 1>>result1.txt
复制代码
  1. cccc.txt -23.8882046924
  2. dddd.txt -65.8839646924
  3. bbbb.txt -268.882046924
  4. aaaa.txt -2603.82046924
复制代码

TOP

我对shell了解不多,你应该多学学linux三剑客
排序文本最后一次匹配到的数据
Gin_Q 发表于 2020-3-21 15:10

感谢感谢!我学了一段时间了,感觉这东西难度较大。问一句题外话,你见多识广,能用一行命令批量在一堆txt文件中的从上往下数第三个空行插入abcd四个字符吗?(这一堆txt文件空行位置和数目都不一致)

TOP

在第四行前面第三行下面
  1. sed.exe -i '4i abcd' aaaa.txt
复制代码

TOP

在第四行前面第三行下面
Gin_Q 发表于 2020-3-21 15:26

这个简单的我会,我那个问题是在第三个空行插入abcd。这些文件第三个空行说不定在那行。我有个思路是这样的:先把这个文件夹所有的文件中空行的行号提出来,然后有了第三个空行的行号就可以在这个行号处加abcd。应该一个不是很复杂的命令,但没写成功。

TOP

返回列表