BASH를 사용하여 CSV 파일의 다른 열에 .txt 파일 데이터를 저장하는 방법은 무엇입니까?

BASH를 사용하여 CSV 파일의 다른 열에 .txt 파일 데이터를 저장하는 방법은 무엇입니까?

다음 데이터 구조를 가진 .txt 파일이 있습니다.

Scan Times:
 33.3 seconds
 77.4 seconds
 33.3 seconds
 77.4 seconds

Check Times:
 110.30 seconds
 72.99 seconds
 72.16 seconds
 110.30 seconds

Move Times:
 73.66 seconds
 90.77 seconds
 72.87 seconds
 71.75 seconds
 
Switch Times:
 92.0 seconds
 78.6 seconds
 77.8 seconds
 84.9 seconds

이제 해당 .txt 파일을 가져와서 다음 형식의 CSV 파일을 만들고 싶습니다.

여기에 이미지 설명을 입력하세요.

지금까지 내 bash 스크립트는 매우 기본적인 레이아웃을 가지고 있지만 진행 방법을 모르겠습니다.

inputFiles=("./Successes/SuccessSummary.txt" "./Failures/FailSummary.txt")
touch results.csv

for file in "${inputFiles[@]}"
do 
    while IFS= read -r line
    do
        #echo $line
        if [ "$line" = "Scan Times:" ]
        then 
        fi

        if [ "$line" = "Check Times:" ]
        then 
        fi

        if [ "$line" = "Move Times:" ]
        then 
        fi
        
        if [ "$line" = "Switch Distances:" ]
        then 
        fi
    done < "$file"
done

답변1

pr -4T file
Scan Times:   Check Times:      Move Times:       Switch Times:
 33.3 seconds      110.30 seconds    73.66 seconds     92.0 seconds
 77.4 seconds      72.99 seconds     90.77 seconds     78.6 seconds
 33.3 seconds      72.16 seconds     72.87 seconds     77.8 seconds
 77.4 seconds      110.30 seconds    71.75 seconds     84.9 seconds

각 열의 빈 행도 표시됩니다.
이전에는 다음을 사용하여 텍스트를 필요한 대로 변경할 수 있었습니다 sed.

sed '/^\s*$/d;s/seconds//' file | pr -4T
Scan Times:   Check Times:  Move Times:   Switch Times:
 33.3          110.30        73.66         92.0
 77.4          72.99         90.77         78.6
 33.3          72.16         72.87         77.8
 77.4          110.30        71.75         84.9

부록:
이 유틸리티는 인쇄용으로 만들어졌으며 이 상황에 적합하지 않은 기본 플래그가 많이 있다는 점을 기억해야 합니다.
-T페이지 매김을 제거하고 머리글과 바닥글을 생략합니다.
-wN페이지 너비를 설정합니다. (기본: -w 72).

추가 2:
또는 각 행을 배열에 쓰는 방법에 대한 예 awk:

awk '
/^\s*$/ {i=0; next}
        {A[i]= A[++i] sprintf("%*s", 12,$($NF ~ /:$/?0:1))}
END     {for(i in A) print A[i]}
' file
 Scan Times:Check Times: Move Times:Switch Times:
        33.3      110.30       73.66        92.0
        77.4       72.99       90.77        78.6
        33.3       72.16       72.87        77.8
        77.4      110.30       71.75        84.9

답변2

Raku(이전 Perl_6) 사용:

raku -e '.join("\t").put for [Z] lines.map(*.trim).batch(6);' 

산출:

Scan Times: Check Times:    Move Times: Switch Times:
33.3 seconds    110.30 seconds  73.66 seconds   92.0 seconds
77.4 seconds    72.99 seconds   90.77 seconds   78.6 seconds
33.3 seconds    72.16 seconds   72.87 seconds   77.8 seconds
77.4 seconds    110.30 seconds  71.75 seconds   84.9 seconds

간단히 말해서 -med(요소별) 및 -ed(일반적으로)가 열 길이(6)를 기준으로 lines수행되어 4개의 배치가 생성되었습니다. 그런 다음 연산자는 각 배치에서 하나의 요소를 연속해서 "압착"합니다. 최종 형식화 단계에서는 요소가 탭과 결합되어 TSV 파일을 생성합니다.trimbatch[Z]join()

[참고: batch연산자는 불완전한 배치에 대해 작동합니다. 완전한 배치만 원하는 경우 rotor대신 batch.를 사용하십시오(단, rotor설정하지 않으면 불완전한 최종 배치에서는 자동으로 실패합니다 :partial).

" seconds"다음으로 삭제두번째아래 Raku의 한 줄(...또는 subst()추가첫 번째위 줄):

perl6 -pe 's:g/" seconds"//;' 

https://raku.org/

관련 정보