使用 awk 查找 KB 中的数字,然后更改并替换为 GB 并显示整行

Posted

技术标签:

【中文标题】使用 awk 查找 KB 中的数字,然后更改并替换为 GB 并显示整行【英文标题】:Using awk to find numbers in KB then change and replace to GB and display the whole line 【发布时间】:2022-01-24 00:15:42 【问题描述】:

尝试以 KB 为单位搜索/下方的数字(封面 KB:7606353,)因此它将显示为(封面 GB:7.25,)我尝试了许多 awk 选项将以下数字从 KB 单位更改为 GB 和我用来将输出发送到文件然后再次使用的其他复杂工具,我的目标是拥有像单个 awk 这样它找到 (Cover KB: ) 之后的数字并将其除以 /1024/1024 并将 KB 更改为 GB 。 . 我达到的最大努力是

awk '($NF == ($NF+0))printf("%s %6.2f\n",$0,$10/1024/1024)ENDprint ""' 

但这会在我需要替换它时在行尾显示我需要的数字。尝试使用 -F 剪切一些列,但也没有得到所需的输出。

来源:

XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 7606353, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 7268433, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 6895144, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 6506311, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 5590773, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 5192929, TARGET GB: 1048576
XX YY ZZ checknpr  Y  checkagain  DEV  Cover KB: 4645949, TARGET GB: 1048576

改为:

XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 7.25, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 6.93, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 6.58, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 6.20, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 5.33, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 4.95, TARGET GB: 1048576   
XX YY ZZ checknpr  Y  checkagain  DEV  Cover GB: 4.43, TARGET GB: 1048576

【问题讨论】:

SO 不是免费的代码编写服务;你应该展示你的研究和编码工作;请使用您尝试过的一些awk 代码以及代码生成的(错误)输出来更新问题 某些输入行可以有Cover KB:的条目吗?所有行的格式是否与示例输入中显示的完全一致(例如,Cover KB: ######, 始终显示为空格分隔的字段 #8-10)? 你的字段分隔符是什么?多个空格或制表符? 不幸的是,有时空格有时是制表符,但幸运的是它们是相同的列和对齐方式 是的,它们总是和上面一样的语法,但如上所述,分隔符可以是空格/2空格/制表符 【参考方案1】:

我建议:

awk '$9=$12; $10=sprintf("%.2f,", $10/$13) print' file

输出:

XX YY ZZ checknpr Y checkagain DEV Cover GB: 7.25, TARGET GB: 1048576 XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.93, TARGET GB: 1048576 XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.58, TARGET GB: 1048576 XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.20, TARGET GB: 1048576 XX YY ZZ checknpr Y checkagain DEV Cover GB: 5.33, TARGET GB: 1048576 XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.95, TARGET GB: 1048576 XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.43, TARGET GB: 1048576

【讨论】:

这正是我所需要的,非常感谢 Cyrus @cyrus【参考方案2】:

这个awk 在不知道条件的字段编号的情况下工作

$ awk ' for(i=1;i<=NF;i++) if($i~/^KB:/) $i="GB:";
    $(i+1)=sprintf("%.2f,",$(i+1)/1024^2)   1' file
XX YY ZZ checknpr Y checkagain DEV Cover GB: 7.25, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.93, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.58, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 6.20, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 5.33, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.95, TARGET GB: 1048576
XX YY ZZ checknpr Y checkagain DEV Cover GB: 4.43, TARGET GB: 1048576

【讨论】:

这更好安德烈:):):) 将尝试编辑以适应其他一些文件,我希望我不要再问了 @mshafey 不用担心。很高兴它对你有用。请记住,如果您的行中有其他 KB:s,则必须调整条件匹配。

以上是关于使用 awk 查找 KB 中的数字,然后更改并替换为 GB 并显示整行的主要内容,如果未能解决你的问题,请参考以下文章

awk 查找表,空白列替换

如何防止 SSMS 在“查找”文件中的查找和替换发生更改

awk查找指定行指定列的数据 并输出到文件

使用 sed/awk/grep 匹配段落并替换为新段落 [重复]

awk && sed ====积累取ip以及sed 查找替换

如何使用 sed/awk 或其他工具辅助查找和替换 12GB 的颠覆转储文件