txt 파일을 xls/csv로 변환하고 싶습니다.
첫 번째 줄은 날짜/시간을 인쇄해야 하고 두 번째 줄은 나머지 모든 데이터를 인쇄해야 합니다(아래 예의 tid부터 테이블까지).
m이 다음 명령을 사용할 때
awk 'BEGIN{ OFS="\t"; print "DateTime,Error"}; NR > 1{print $1,$2;}' TMP.txt > Output.xls
첫 번째 줄에는 날짜/시간을 인쇄하지만 다음 열에는 tid만 인쇄합니다.
누구든지 두 번째 열에 남은 텍스트를 모두 인쇄하도록 도와줄 수 있나요?
텍스트 파일에 기록됨:
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
대체를 사용하는 것입니다.첫 번째탭 공백을 사용하면 원하는 결과를 얻을 수 있습니다.
헤더 줄도 포함하려고 하므로 다음이 작동해야 합니다( sed
GNU를 사용한다고 가정).
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
물론 이렇게 하면 출력에서 다른 타임스탬프 형식이 유지됩니다. 이를 통합 형식으로 변환하려면 쉘 스크립트를 사용해야 할 수도 있습니다.