txt 파일을 xls/csv로 변환하고 싶습니다.
첫 번째 행은 날짜/시간을 인쇄해야 하고 두 번째 행은 나머지 모든 데이터를 인쇄해야 합니다(아래 예에서는 tid부터 테이블까지).
m 아래 명령을 사용할 때
awk 'BEGIN{ OFS="\t"; print "DateTime,Error"}; NR > 1{print $1,$2;}' TMP.txt > Output.xls
첫 번째 행에는 날짜/시간이 인쇄되지만 다음 열에는 시간만 인쇄됩니다.
누구든지 두 번째 열의 나머지 텍스트 전체를 인쇄하도록 도와주세요.
텍스트 파일에 기록:
2019-11-26T11:51:32.087-08:00 tid: JCA-work-instance:AQ Adapter-8 userId: <anonymous> 0 , APP: Service Bus Logging FlowId: 0000MtDbHiu8pmk5Szd9ic1TlVox0015xl RouteNode2, null, null, REQUEST Queried data from header table
다음 유형의 로그 항목도 고려해야 합니다.
Nov 28, 2019 8:19:03 AM PST HTTP BEA-101019 [ServletContext[text] Servlet failed with an IOException.
Nov 28, 2019 8:22:40 AM PST [null, null, null, ERROR] error in service-callouterror service to get information
답변1
표시되는 동작의 이유는 기본적으로 공백, 탭 등을 입력 필드 구분 기호로 awk
처리하기 때문입니다. WHITESPACE
따라서,모든공백으로 둘러싸인 입력 파일의 항목은 단일 "필드"로 처리되며 자체 $<number>
내부 변수가 할당됩니다. awk
그러나 귀하의 명령은 awk
처음 두 개의 필드( $1
및 $2
)만 인쇄하도록 지시합니다. 귀하의 경우에는 날짜/시간 문자열과 리터럴입니다 tid:
.
특별한 경우에 가장 쉬운 방법은 교체하는 것입니다 sed
.첫 번째원하는 결과를 제공해야 하는 표로 공백을 만듭니다.
헤더 줄도 포함하려고 하므로 다음이 작동합니다(GNU를 sed
사용한다고 가정).
sed -e '1 i\DateTime\tError' -e 's/ /\t/' TMP.txt > Output.txt
첫 번째 표현식은 줄 시작 부분에 텍스트 한 줄을 삽입하고, 두 번째 표현식은 의도한 "실제 서식 지정"을 수행합니다.
업데이트
awk
귀하가 제공한 추가 문자열 형식의 경우 대신 다음을 사용하겠습니다 sed
(GNU awk를 사용합니다).
awk 'BEGIN{printf("DateTime\tError\n")} {match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[01]?[[:digit:]]:[012345][[:digit:]]:[012345][[:digit:]][[:space:]]+[AP]M[[:space:]]+[[:alpha:]]+)[[:space:]]+([[:print:]]*)$", fields); printf("%s\t%s\n", fields[1], fields[2])}' TMP.txt > Output.txt
이 정규식은 사용자가 지정한 시간 형식과 하나 이상의 공백, 그 다음 줄 끝까지 인쇄 가능한 임의의 문자를 일치시키고 첫 번째 (...)
하위 그룹, 타임스탬프, a \t
및 두 번째 하위 그룹을 인쇄합니다. (...)
"라인의 나머지 부분"인 하위 그룹입니다. 또한 BEGIN
앵커는 머리글 줄을 맨 위에 삽입하는 데 사용됩니다.
두 경우 모두 동일한 파일에서 발생할 수 있으므로 이를 단일 awk
프로그램으로 결합해야 합니다.
BEGIN {
printf("DateTime\tError\n");
}
{
if (match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[012]?[[:digit:]](:[012345][[:digit:]]){2}[[:space:]]+[AP]M[[:space:]]+[[:upper:]]+)[[:space:]]+([[:print:]]*)$", fields) == 0)
match($0,"^(20[[:digit:]]{2}-[01][[:digit:]]-[0123][[:digit:]][[:alpha:]][012][[:digit:]](:[012345][[:digit:]]){2}.[[:digit:]]{3}[+-][012][[:digit:]]:[012345][[:digit:]])[[:space:]]+([[:print:]]*)$", fields);
printf("%s\t%s\n", fields[1], fields[3]);
}
위의 스크립트를 호출 xlsconvert.awk
한 다음 다음과 같이 호출 할 수 있습니다.
user@host$ awk -f xlsconvert.awk TMP.txt > Output.txt
물론 이렇게 하면 출력에 다양한 타임스탬프 형식이 유지됩니다. 이를 통합 형식으로 변환하려면 쉘 스크립트를 사용해야 할 수도 있습니다.