使用 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 并显示整行的主要内容,如果未能解决你的问题,请参考以下文章
使用 sed/awk/grep 匹配段落并替换为新段落 [重复]