날짜를 기준으로 선 분할

날짜를 기준으로 선 분할
Thu_Jun_04_09:22:50_2020=abcd:some_string=Thu_Jun_04_09:39:54_2020=efgh:some_string=Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

위의 출력이 있지만 다음 형식을 원합니다.

Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

날짜를 기준으로 선을 분할하는 방법이 있습니까?

답변1

input 이 있다고 가정하면 file다음을 수행할 수 있습니다(GNU sed):

$ sed 's/=/\n/2;P;D' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

s/=/\n/2두 번째 문자를 개행 문자 =로 바꿉니다 . \n그러면 P;현재 패턴 공간의 모든 내용이 첫 번째 패턴(현재 읽고 있는 내용)까지 인쇄되고 패턴 공간이 지워져 프로세스를 다시 시작할 수 있습니다. 이는 다음 위치에 기록됩니다.\nDman sed

   D      If pattern space contains no newline, start a normal  new  cycle
          as  if  the d command was issued.  Otherwise, delete text in the
          pattern space up to the first newline, and  restart  cycle  with
          the  resultant  pattern space, without reading a new line of in‐
          put.
   P      Print  up  to  the first embedded newline of the current pattern
          space.

또는 GNU를 사용하여 grep다음을 수행할 수 있습니다.

$ grep -oP '[^=]+=[^=]+' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

그러면 문자가 아닌 부분을 찾은 다음 =a =, 또 다른 부분이 아닌 부분을 찾습니다 =. grep에게 줄의 일치하는 부분만 인쇄하도록 지시 -o하면 결과는 찾고 있는 그룹이 인쇄됩니다.


awk또 다른 옵션은 with를 입력 필드 구분 기호 로 사용 =하고 필드를 쌍으로 인쇄하는 것입니다.

$ awk -F= '{for(i=2;i<=NF;i+=2){print $(i-1)"="$i}} ' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

답변2

$ tr '=' '\n' <file | paste -d '=' - -
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

먼저 =,를 사용하여 모든 문자를 개행 문자로 바꾼 다음 ,를 사용하여 두 개의 열로 구분 기호로 tr형식을 다시 지정합니다 .=paste


표준 sed:

$ sed -e 'y/=/\n/' -e 's/\n/=/;P;D' file
Thu_Jun_04_09:22:50_2020=abcd:some_string
Thu_Jun_04_09:39:54_2020=efgh:some_string
Thu_Jun_04_09:51:12_2020=ijkl:some_string,some_string

먼저 =패턴 공간의 모든 문자를 개행 문자로 바꿉니다. 그런 다음 첫 번째 개행 문자를 로 바꾸고 =패턴 공간의 초기 부분(최대 첫 번째 개행 문자까지)을 인쇄한 다음 인쇄된 부분을 제거합니다. 그런 다음 나머지 데이터로 루프를 다시 시작합니다.

Telden의 답변GNU가 있으면 사용은 하겠지만 sed포팅은 불가능합니다.끼워 넣다s///표준 명령을 사용하면 줄 바꿈이 가능합니다 sed. 그러나 표준 y///명령에서는 개행 문자를 삽입하는 데 문제가 없습니다.

관련 정보