연속된 줄을 하나로 병합

연속된 줄을 하나로 병합

텍스트 파일에서 한 줄의 처음 25자가 공백인 경우 첫 번째 열에 ASCII 문자로 시작하는 다른 줄이 있을 때까지 해당 줄을 이전 줄에 어떻게 추가합니까? 여기서는 볼 수 없어서 스크린샷을 추가했습니다여기에 이미지 설명을 입력하세요.. 원본 파일에서는 먼저 각 줄의 뒤에 오는 공백을 제거해야 합니다. 이것은 작동하지만 나머지를 구현하는 방법을 모르겠습니다. 나는 모든 것을 스크립트로 갖는 것을 선호합니다(Perl이나 이와 유사한 것이 아님).

원본 파일:

08/07/2023 09:02:07      ANR8592T Session 137576 connection is using protocol
                         TLSVI3, cipher specification TLS_AES_256_GCM_SHA384,
                         certificate TSM Self-Signed Certificate. (SESSION:
                         137576)
08/07/2023 09:02:07      ANR@B4OT Session 137576 started for administrator ADMIN
                         (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]-
                         :65234) on MU-SV-SPS1.de.bertrandt.net:1500. (SESSTON:
                         137576)
08/07/2023 09:02:07      ANR2017T Administrator ADMIN issued command: select
                         status from processes where process="NAS SnapMirror
                         Backup’ and status like 'WMU-SV-CL2%' (SESSION: 137576)
                         08/07/2023 09:02:07 ANR@46ST Session 137576 ended for administrator ADMIN
                         (WinNT). (SESSION: 137576)
08/07/2023 09:02:38      ANR8592T Session 137577 connection is using protocol
                         TLSVI3, cipher specification TLS_AES_256_GCM_SHA384,
                         certificate TSM Self-Signed Certificate. (SESSION:
                         137577)
08/07/2023 09:02:38      ANR@B4OT Session 137577 started for administrator ADMIN
                         (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]-
                         :65235) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON:
                         137577)
08/07/2023 09:02:38      ANR2017T Administrator ADMIN issued command: select
                         node_name, filespace_name, BACKUP_START, BACKUP_END,
                         CAPACITY, PCT_UTIL from filespaces where node_name like
                         “MU-SV-CL2%" (SESSION: 137577)
08/07/2023 09:02:38      ANR@46ST Session 137577 ended for administrator ADMIN
                         (WinNT). (SESSION: 137577)
08/07/2023 09:02:38      ANR8592T Session 137578 connection is using protocol
                         TLSVI3, cipher specification TLS_AES_256_GCM_SHA384,
                         certificate TSM Self-Signed Certificate. (SESSION:
                         137578)
08/07/2023 09:02:38      ANR@B4OT Session 137578 started for administrator ADMIN
                         (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]-
                         :65236) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON:
                         137578)

요청된 결과:

08/07/2023 09:02:07      ANR8592T Session 137576 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137576)
08/07/2023 09:02:07      ANR@B4OT Session 137576 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65234) on MU-SV-SPS1.de.bertrandt.net:1500. (SESSTON: 137576)
08/07/2023 09:02:07      ANR2017T Administrator ADMIN issued command: select status from processes where process="NAS SnapMirror Backup’ and status like 'WMU-SV-CL2%' (SESSION: 137576) 08/07/2023 09:02:07 ANR@46ST Session 137576 ended for administrator ADMIN (WinNT). (SESSION: 137576)
08/07/2023 09:02:38      ANR8592T Session 137577 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137577)
08/07/2023 09:02:38      ANR@B4OT Session 137577 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65235) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137577)
08/07/2023 09:02:38      ANR2017T Administrator ADMIN issued command: select node_name, filespace_name, BACKUP_START, BACKUP_END, CAPACITY, PCT_UTIL from filespaces where node_name like “MU-SV-CL2%" (SESSION: 137577)
08/07/2023 09:02:38      ANR@46ST Session 137577 ended for administrator ADMIN (WinNT). (SESSION: 137577)
08/07/2023 09:02:38      ANR8592T Session 137578 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137578)
08/07/2023 09:02:38      ANR@B4OT Session 137578 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65236) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137578)

답변1

sed이 답변 끝에 있는 솔루션을 사용하세요 .

편집기를 사용하여 ed먼저 줄 시작 부분의 모든 공백(탭 또는 공백)을 단일 공백으로 바꾼 다음 공백으로 시작하는 각 줄을 이전 줄과 연결합니다.

printf '%s\n' 'g/^[[:blank:]]\{1,\}/ s// /' 'g/^ / -,.j' ,p Q | ed -s file

결과 문서는 표준 출력 스트림으로 인쇄되지만 원본 파일에 다시 기록되도록 ,p변경할 수 있습니다.w

이 편집 세션의 두 가지 주요 명령은 다음과 같습니다.

  1. g/^[[:blank:]]\{1,\}/ s// /
    이렇게 하면 줄의 시작 부분에서 하나 이상의 공백이 모두 제거되고 단일 공백으로 대체됩니다.
  2. g/^ / -,.j
    이렇게 하면 공백으로 시작하는 각 줄이 바로 앞 줄에 연결됩니다.

이 두 명령을 및 명령을 모두 실행하는 g하나의 명령으로 결합합니다 .gsj

printf '%s\n' 'g/^[[:blank:]]\{1,\}/ s// /\' '-,.j' ,p Q | ed -s file

다음 샘플 입력으로 테스트하세요.

XXX XXX XXX     YYY YYY YYY YYY YYY
                ZZZ ZZZ ZZZ ZZZ ZZZ
                YYY ZZZ YYY ZZZ YYY
                YYY ZZZ YYY ZZZ YYY
                YYY ZZZ YYY ZZZ YYY
XXX XXX XXX     YYY YYY YYY YYY YYY
                ZZZ ZZZ ZZZ ZZZ ZZZ
                YYY ZZZ YYY ZZZ YYY
XXX XXX XXX     YYY YYY YYY YYY YYY
                ZZZ ZZZ ZZZ ZZZ ZZZ
                YYY ZZZ YYY ZZZ YYY
                YYY ZZZ YYY ZZZ YYY
                YYY ZZZ YYY ZZZ YYY

결과:

XXX XXX XXX     YYY YYY YYY YYY YYY ZZZ ZZZ ZZZ ZZZ ZZZ YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY
XXX XXX XXX     YYY YYY YYY YYY YYY ZZZ ZZZ ZZZ ZZZ ZZZ YYY ZZZ YYY ZZZ YYY
XXX XXX XXX     YYY YYY YYY YYY YYY ZZZ ZZZ ZZZ ZZZ ZZZ YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY YYY ZZZ YYY ZZZ YYY

공백이나 탭으로 줄을 들여쓰는지 여부는 중요하지 않습니다. 또한 각 "섹션"의 첫 번째 비트( XXX...예제에서는 비트)와 나머지 부분(공백 또는 탭 사용 여부) 사이의 간격은 변경되지 않습니다.


그리고 sed:

sed -e '/^[[:blank:]]\{1,\}/ { s///; H; $!d; }' -e 'x; y/\n/ /' file

이는 하나 이상의 초기 공백이 있는 행을 감지하고 해당 공백을 제거한 후 해당 행을 예약된 공간( sed사이클 사이에 지워지지 않는 보조 버퍼)에 추가합니다. 해당 줄이 마지막 줄이 아니면 해당 줄은 삭제되고 스크립트는 다음 입력 줄로 이동합니다.

다른 줄(및 공백으로 시작하는 문서의 마지막 줄)의 경우 버퍼는 보존된 공백으로 교체되고 H결과가 출력되기 전에 모든 줄 바꿈(명령에 의해 구분 기호로 삽입됨)은 공백으로 대체됩니다.

이는 위의 파이프라인과 동일한 출력을 생성 ed하지만 공백으로 시작하지 않으면 입력의 마지막 줄을 처리할 수 없습니다(가능한 한 예제 텍스트에서는 그렇지 않습니다). 이미지를 통해 알 수 있습니다.)

답변2

이상한 솔루션

스크립트 format_text.awk:

#! /usr/bin/awk -f

/^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ {
    if (line) {
        print line
    }
    line = $0
    next
}
{
    gsub(/^[ \t]+/, "")
    line = line " " $0
}
END {
    if (line) {
        print line
    }
}

그리고:

chmod +x format_text.awk

다음과 같이 실행하세요:

./format_text.awk log.txt

답변3

POSIX awk를 사용하십시오.

$ awk -F'^[[:space:]]+' '
    NF==1 { if (NR>1) print rec; rec=$0; next }
    { rec = rec OFS $2 }
    END { print rec }
' file
08/07/2023 09:02:07      ANR8592T Session 137576 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137576)
08/07/2023 09:02:07      ANR@B4OT Session 137576 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65234) on MU-SV-SPS1.de.bertrandt.net:1500. (SESSTON: 137576)
08/07/2023 09:02:07      ANR2017T Administrator ADMIN issued command: select status from processes where process="NAS SnapMirror Backup’ and status like 'WMU-SV-CL2%' (SESSION: 137576) 08/07/2023 09:02:07 ANR@46ST Session 137576 ended for administrator ADMIN (WinNT). (SESSION: 137576)
08/07/2023 09:02:38      ANR8592T Session 137577 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137577)
08/07/2023 09:02:38      ANR@B4OT Session 137577 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65235) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137577)
08/07/2023 09:02:38      ANR2017T Administrator ADMIN issued command: select node_name, filespace_name, BACKUP_START, BACKUP_END, CAPACITY, PCT_UTIL from filespaces where node_name like “MU-SV-CL2%" (SESSION: 137577)
08/07/2023 09:02:38      ANR@46ST Session 137577 ended for administrator ADMIN (WinNT). (SESSION: 137577)
08/07/2023 09:02:38      ANR8592T Session 137578 connection is using protocol TLSVI3, cipher specification TLS_AES_256_GCM_SHA384, certificate TSM Self-Signed Certificate. (SESSION: 137578)
08/07/2023 09:02:38      ANR@B4OT Session 137578 started for administrator ADMIN (WinNT) (SSL MU-SV-SPS1.de.bertrandt.net[192.168.171.56]- :65236) on MU-SV-SPS1.de.bertrandt.net:1560. (SESSTON: 137578)

답변4

이것은 한 줄 솔루션입니다.sed

sed -E -z 's/\n([ ]{25})//g' ./input.txt > ./output.txt
  • -E정규식을 사용하도록 지정합니다.
  • -z\n문자 일치
  • s/\n([ ]{25})//g
    • s/바꾸다
    • \n([ ]{25})/줄바꿈 뒤에 25개의 공백이 오는 것을 아무것도 없는 것으로 바꿉니다.
    • /g콘텐츠에 대해 전역적으로 작업 수행

관련 정보