Unix에서 txt를 xls로 편집하는 방법은 무엇입니까?

Unix에서 txt를 xls로 편집하는 방법은 무엇입니까?

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$2tid:

특정 경우에 가장 간단한 접근 방식은 sed대체를 사용하는 것입니다.첫 번째탭 공백을 사용하면 원하는 결과를 얻을 수 있습니다.

헤더 줄도 포함하려고 하므로 다음이 작동해야 합니다( sedGNU를 사용한다고 가정).

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

물론 이렇게 하면 출력에서 ​​다른 타임스탬프 형식이 유지됩니다. 이를 통합 형식으로 변환하려면 쉘 스크립트를 사용해야 할 수도 있습니다.

관련 정보