다음 데이터 구조를 가진 .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 파일을 생성합니다.trim
batch
[Z]
join()
[참고: batch
연산자는 불완전한 배치에 대해 작동합니다. 완전한 배치만 원하는 경우 rotor
대신 batch
.를 사용하십시오(단, rotor
설정하지 않으면 불완전한 최종 배치에서는 자동으로 실패합니다 :partial
).
" seconds"
다음으로 삭제두번째아래 Raku의 한 줄(...또는 subst()
추가첫 번째위 줄):
perl6 -pe 's:g/" seconds"//;'