将变量附加到 bash 中文件的不同行

将变量附加到 bash 中文件的不同行

假设我有一个包含以下文本的文件。

我正在阅读的源文件是这样的:

#0  abc 2016-08-06 01:12:57 AM  9.1%    779.9M of 1G    156.3M of 1G
#1  abc 2016-08-06 02:33:47 AM  12.1%   339.9M of 1G    126.3M of 1G

以下是我正在使用的脚本

#!/bin/bash

opFile="opfile.txt"
sourceFile="TestOutput"

    if [[ ! -e "$opFile" ]]
    then
    {
        touch $opFile
        count=0
        grep "#" "$sourceFile" | while read -r line ; do
        {
            cpu=$(grep "#$count" "$sourceFile" | cut -f 4 | cut -d% -f1)
            mem=$(grep "#$count" "$sourceFile" | cut -f 5 | cut -dM -f1)
            disk=$(grep "#$count" "$sourceFile" | cut -f 6 | cut -dM -f1)
            echo -e "$cpu\n$mem\n$disk" >> "$opFile"
            ((count++))
        }   
        done

    }
    else
    {
        count=0
        lineCounter=0
        grep "#" "$sourceFile" | while read -r line ; do
        {
            cpu=$(grep "#$count" "$sourceFile" | cut -f 4 | cut -d% -f1)
            mem=$(grep "#$count" "$sourceFile" | cut -f 5 | cut -dM -f1)
            disk=$(grep "#$count" "$sourceFile" | cut -f 6 | cut -dM -f1)
            ((lineCounter++))
            sed ""$lineCounter"s/$/,"$cpu"/" "$opFile" | tee "$opFile"
            ((lineCounter++))
            sed ""$lineCounter"s/$/,"$mem"/" "$opFile" | tee "$opFile" 
            ((lineCounter++))
            sed ""$lineCounter"s/$/,"$disk"/" "$opFile" | tee "$opFile" 
            ((count++))

        }
        done
    }
    fi

现在,该脚本需要在该 $sourceFile 上运行多次,因为该文件中的数字会不断变化。所以第一次运行脚本时,输出是这样的

9.1
779.9
156.3
12.1
339.9
126.3

第二次运行时(假设源文件中的值相同),输出应该如下所示。

9.1,9.1
779.9,779.9
156.3,156.3
12.1,12.1
339.9,339.9
126.3,126.3

现在,我使用的 sed 行是正确的,我很确定,但是在将其放入文件中时遇到了问题。我本可以使用 >> 输出重定向器,但这会将所有内容打印在新行上。 Tee 的工作有点出乎意料,有时它会做正确的事情,其他时候,我的 opfile.txt 是空的。关于如何将 sed 输出正确放入文件中的任何想法?不,最好,我不希望在标准输出上显示任何内容。

谢谢!

答案1

错误的是我试图写入我正在读取的同一个文件。因此,当您使用 > 写入文件时,当文件打开时,它会在 sed 将其内容放入其中之前被截断,从而形成空文件(这是我的想法,如果我错了,请纠正我)。类似的逻辑也一定是为什么 tee 如此出人意料地工作的逻辑。

最后,一位 stackoverflow 朋友建议的解决方法以一种更简单的方式实现了这一点。

paste -d, output.txt <(grep -oP '[0-9.]+(?=%)|[0-9.]+(?=[A-Z]+ of)' source.txt) > tmp ; mv tmp output.txt

因此,为了防止这种脏读问题的发生,使用了临时文件。谢谢大家的帮助。

相关内容