![格式化 awk 输出并附加到现有文件](https://linux22.com/image/184905/%E6%A0%BC%E5%BC%8F%E5%8C%96%20awk%20%E8%BE%93%E5%87%BA%E5%B9%B6%E9%99%84%E5%8A%A0%E5%88%B0%E7%8E%B0%E6%9C%89%E6%96%87%E4%BB%B6.png)
我在 awk 中有一个命令:awk -F, '{$1=sprintf("%.2f",$1*value)}1' value=$VALUE OFS=, input.txt
对输入文件的第一列进行乘法:
2097160 /home/x/a/c/2GB/
102408 /home/y/b/d/100MB/
...
输出是:
0.66
0.03
...
我想要的是将上面的输出作为最后一列附加到另一个由制表符分隔并以美元符号开头的文件,$
使其看起来像:
2.1G /home/x/a/c/2GB/ $0.66
101M /home/y/b/d/100MB/ $0.03
...
如何在不创建多个文件等的情况下执行此操作?
答案1
我制作了这些文件用作输入:
$ cat file1
2097160 /home/x/a/c/2GB/
102408 /home/y/b/d/100MB/
$ cat file1
2097160 /home/x/a/c/2GB/
102408 /home/y/b/d/100MB/
然后,我简单地修改了您的脚本,以便它读取两个文件,并且在读取第一个文件时(当前文件的记录号 FNR 与输入记录号 NR 相同),它将保存乘法的结果在索引为路径的数组中:
$ awk '(NR==FNR){a[$2]=sprintf("%.2f",$1*value); next} {print $1,$2,a[$2]}' OFS="\t" value=0.000000315 file1 file2
2.1G /home/x/a/c/2GB/ 0.66
101M /home/y/b/d/100MB/ 0.03
答案2
为了好玩,一个 Perl 单行代码使用数量::字节::人类模块:
perl -MNumber::Bytes::Human=format_bytes -slane '
printf "%s\t%s\t\$%.2f\n",
format_bytes($F[0] * 1024),
$F[1],
$value * $F[0]
' -- -value=0.000000315 file
2.1G /home/x/a/c/2GB/ $0.66
101M /home/y/b/d/100MB/ $0.03