여러 줄을 한 줄로 변환

여러 줄을 한 줄로 변환

다음 4줄이 있습니다.

EXTRACT    ETEST  Last Started 2016-03-20 20:56   Status RUNNING  
Checkpoint Lag       00:00:02 (updated 00:00:04 ago)
EXTRACT    PTEST  Initialized   2016-03-31 06:25   Status STOPPED 
Checkpoint Lag       00:00:00 (updated 02:21:09 ago)

나는 그것들을 다음과 같이 두 줄로 나누고 싶습니다.

EXTRACT    ETEST  Last Started 2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:04 ago)
EXTRACT    PTEST  Initialized  2016-03-31 06:25   Status STOPPED Checkpoint Lag       00:00:00 (updated 02:21:09 ago)

나는 그것을 만들 수 있습니다 cat /tmp/glog.lst|xargs -n 14:

EXTRACT    ETEST  Last Started 2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:04 ago)
EXTRACT    PTEST  Initialized  2016-03-31 06:25   Status STOPPED Checkpoint Lag       00:00:00 (updated 02:21:09 ago)

그러나 row1에는 14개의 필드가 있고 row2에는 13개의 필드가 있습니다.

문제는 row2가 "Last Start"로 초기화되었다는 것입니다.

14개 미만의 열에서 14개의 열로 행을 만들고, "N"(또는) 무언가로 더미 열을 설치하여 14개의 열을 갖게 하여 스크립트로 쉽게 처리할 수 있도록 하고 싶습니다.

나도 결국 하고 싶어

EXTRACT    ETEST  Last Started  2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:04 ago)
EXTRACT    PTEST  Initialized N 2016-03-31 06:25   Status STOPPED Checkpoint Lag       00:00:00 (updated 02:21:09 ago)

이게 내가 필요한 거야

$ awk '{ if (FNR%2==1) tmp=$0; else print tmp,$0 }'  /tmp/gglog.lst
EXTRACT    ETEST1  Initialized 2016-03-20 20:56   Status STOPPED Checkpoint Lag       00:00:02 (updated 00:00:09 ago)
EXTRACT    ETEST2  Last Started 2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:04 ago)
EXTRACT    ETEST3  Last Started 2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:09 ago)
EXTRACT    PTEST1  Last Started 2016-03-29 08:46   Status RUNNING Checkpoint Lag       00:00:00 (updated 00:00:02 ago)
EXTRACT    PTEST0  Last Started 2016-03-29 08:46   Status RUNNING Checkpoint Lag       00:00:00 (updated 00:00:05 ago)

이제 초기화/마지막/시작됨 열 값을 꺼내서 다음과 같이 보이도록 하고 싶습니다.

EXTRACT    ETEST1  2016-03-20 20:56   Status STOPPED Checkpoint Lag       00:00:02 (updated 00:00:09 ago)
EXTRACT    ETEST2  2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:04 ago)
EXTRACT    ETEST3  2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:09 ago)
EXTRACT    PTEST1  2016-03-29 08:46   Status RUNNING Checkpoint Lag       00:00:00 (updated 00:00:02 ago)
EXTRACT    PTEST0  2016-03-29 08:46   Status RUNNING Checkpoint Lag       00:00:00 (updated 00:00:05 ago)

아니면 "초기화"를 중단하여 "즉시 초기화"할 수 있습니까? 우리가 보관한 행이 초기화되었든 이를 "지금 초기화"로 분류하고 싶습니다.

EXTRACT    ETEST1  Init Now 2016-03-20 20:56   Status STOPPED Checkpoint Lag       00:00:02 (updated 00:00:09 ago)
EXTRACT    ETEST2  Last Started 2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:04 ago)
EXTRACT    ETEST3  Last Started 2016-03-20 20:56   Status RUNNING Checkpoint Lag       00:00:02 (updated 00:00:09 ago)
EXTRACT    PTEST1  Last Started 2016-03-29 08:46   Status RUNNING Checkpoint Lag       00:00:00 (updated 00:00:02 ago)
EXTRACT    PTEST0  Last Started 2016-03-29 08:46   Status RUNNING Checkpoint Lag       00:00:00 (updated 00:00:05 ago)

답변1

  • 2개씩 병합하려면:

    awk '{ if(FNR%2==1) tmp=$0; else print tmp,$0 }' tmp/glog.lst

  • Initialized다음으로 교체 Init Now:

    sed 's/Initialized/Init Now/' tmp/glog.lst

  • 두 작업을 동시에 수행하려면 파이프를 사용하여 연결하세요.

    awk '{ if(FNR%2==1) tmp=$0; else print tmp,$0 }' tmp/glog.lst | sed 's/Initialized/Init Now/'

답변2

제목 질문에 대답하려면 다음을 사용하여 연속된 줄을 연결할 수 있습니다 sed.

sed 'N;s/\n/ /' /tmp/glog.lst

그러나 귀하의 열 질문은 실제로 완전히 별도의 질문입니다. 이것최고해결책은,상류로 헤엄치다glog.lst파일을 생성하고 만드는 도구에합리적인 구분 기호를 사용하세요공백 대신.

완전히 불가능한 경우에는 문제를 해결할 수 있지만 다른 모든 것은 반드시 해킹일 뿐입니다.

관련 정보