Answers:
您可以在awk中将其作为两阶段解决方案来完成:
awk 'FNR == NR { n = $2; next } { print $1, $2/n }' infile infile
如果您的awk版本支持ENDFILE块(例如GNU awk 4+),则可以这样做:
awk 'ENDFILE { n = $2 } FNR != NR { print $1, $2/n }' infile infile
请注意,到seek
文件末尾先查看camh的答案效率更高。
说明
第一个示例通过记住前面的示例来工作$2
,即仅当本地行计数器(FNR
)等于全局行计数器(NR
)时才进行评估。该next
命令跳到下一行,在这种情况下,它确保仅在解析第二个参数时才评估最后一个块。
第二个示例具有类似的逻辑,但是利用了ENDFILE块,该块在到达输入文件的末尾时进行评估。
如果您的数据源是可以多次读取的文件(即,它不是流),则应首先使用tail(1)
来从最后一行获取所需的数据,然后将其传递给awk以对其进行顺序处理。tail
将寻求到文件的末尾以读取最后一行,而无需先读取所有数据。
awk -v norm=$(tail -n 1 file | cut -d' ' -f2) '{print $1, $2/norm}' file
对于大型文件而言,这将是一个巨大的胜利,因为整个文件将无法容纳在缓冲区缓存中(这意味着需要从磁盘读取两次,每次通过一次),并且由于不需要扫描而在较小程度上有所帮助输入到最后一行。较小的文件可能与两次通过方法没有太大区别。
$ awk --version GNU Awk 3.1.8
。您能否对如何处理两个输入文件以及如何处理添加一个非常小的解释next
?