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

따라서 이러한 더티 읽기 문제가 발생하는 것을 방지하기 위해 임시 파일을 사용합니다. 도움을 주셔서 감사합니다.

관련 정보