CR로 구분된 문자열을 여러 줄로 나누고 각 줄에 ID를 추가하는 방법은 무엇입니까?

CR로 구분된 문자열을 여러 줄로 나누고 각 줄에 ID를 추가하는 방법은 무엇입니까?

다음과 같이 내부 캐리지 리턴으로 구분된 줄이 있는 파일이 있습니다.

전자기 펄스|123|10\아르 자형정보|존|스미스|M|1980/01/12\아르 자형주소 | 오하이오주 브리지 로드 |
전자기 펄스|456|10\아르 자형정보|데이비드|퍼트|M|1980/02/12\아르 자형주소 | 오하이오주 브리지 로드 |
전자기 펄스|789|10\아르 자형정보|제인|맥켄지|F|1980/03/12\아르 자형주소 | 오하이오주 브리지 로드 |

CR 사이의 줄 부분은 |문자로 더 구분됩니다.

CR 문자에서 각 줄을 별도의 줄로 나누고 싶습니다. 그러면 각각새로운라인(즉, CR을 개행 문자로 대체하여 형성된 라인)은 |원래 라인(두 번째 구분 필드)의 ID로 시작해야 합니다.

예상 출력:

EMP|123|10
123|INFO|JOHN|SMITH|M|01/12/1980
123|ADDR|125|BRIDGE RD|COLUMBUS|OH
EMP|456|10
456|INFO|DAVID|PIRT|M|02/12/1980
456|ADDR|257|BRIDGE RD|COLUMBUS|OH
EMP|789|10
789|INFO|JENN|MCKENZI|F|03/12/1980
789|ADDR|389|BRIDGE RD|COLUMBUS|OH

ID가 반복되므로 출력의 세 행으로 구성된 각 집합이 동일한(1개) 입력 행에 속한다는 것을 알 수 있습니다.

다음 명령을 시도했지만 CR을 새 줄로만 대체했습니다. 새 줄에 ID를 추가하는 방법을 모르겠습니다.

tr '\r' '\n' < test.txt > new.txt

산출:

EMP|123|10
INFO|JOHN|SMITH|M|01/12/1980
ADDR|125|BRIDGE RD|COLUMBUS|OH
EMP|456|10
INFO|DAVID|PIRT|M|02/12/1980
ADDR|257|BRIDGE RD|COLUMBUS|OH
EMP|789|10
INFO|JENN|MCKENZI|F|03/12/1980
ADDR|389|BRIDGE RD|COLUMBUS|OH

어떻게 해야 하나요?

답변1

어때요?

$ awk -F '\r' '{
  print $1; 
  split($1,a,"|"); 
  for(i=2;i<=NF;i++) print a[2] "|" $i;
}' file
EMP|123|10
123|INFO|JOHN|SMITH|M|01/12/1980
123|ADDR|125|BRIDGE RD|COLUMBUS|OH
EMP|456|10
456|INFO|DAVID|PIRT|M|02/12/1980
456|ADDR|257|BRIDGE RD|COLUMBUS|OH
EMP|789|10
789|INFO|JENN|MCKENZI|F|03/12/1980
789|ADDR|389|BRIDGE RD|COLUMBUS|OH

답변2

sed에서:

sed ':loop; s/^\([^|]*|\)\([^|]*|\)\([^\r]*\)\r/\1\2\3\n\2/; t loop'

이것은 (일종의) 간단한 대체입니다. 즉, \r버퍼의 첫 번째 문자까지 모든 문자(즉, 최대 및 포함)로 구성된 패턴을 일치시킵니다. 세 개의 캡처 그룹으로 나눕니다.

  • |모든 것은 버퍼의 첫 번째 항목 까지(즉, 포함하여) 진행됩니다 . 이는 EMP|파일의 모든 줄에 적용됩니다.
  • |그 이후의 모든 것, 즉 버퍼의 다음(즉, 두 번째) 까지(즉, 최대 및 포함) . 이 이름은 123|,  456| 또는  789| 파일에 있습니다.
  • 그 이후의 모든 것은 (그러나아니요\r포함) 버퍼의 첫 번째.

그런 다음 위의 내용을 다음으로 대체하십시오.

  • 세 개의 캡처링 그룹( ), 즉 버퍼의 첫 번째 그룹 \1\2\3까지의 \r모든 것 (포함하지 않음)
  • 개행 문자 및
  • 두 번째 캡처 그룹( \2), 즉 id 및  |.

그런 다음 나머지 버퍼(모든 것뒤쪽에\r첫째) 버퍼의 내용은 그대로 남아 있으므로 새로 생성된 행의 중복 ID 뒤에 있습니다.

글쎄요, 위와 일치한다면에스교체 성공( t시험)로 이동하여 성공하면 돌아가서 다시 시도하세요.

초보자에게 명확하지 않을 수 있는 한 가지 측면은 우리가 \n사용  하더라도에스ubstitute 명령을 사용하여 새 줄을 만들고 sed전체 버퍼에서 계속 작동합니다(포함하다"개행"(즉, 개행 다음 부분)이 아닌 내부/내장 개행)입니다. 자,  sed첫 번째 줄을 읽어보세요.

EMP|123|10\rINFO|JOHN|SMITH|M|01/12/1980\rADDR|125|BRIDGE RD|COLUMBUS|OH

완충지대에 들어가세요. 이 명령을 s처음 실행한 후 ,완충기포함하다

EMP|123|10
123|INFO|JOHN|SMITH|M|01/12/1980\rADDR|125|BRIDGE RD|COLUMBUS|OH

따라서 s명령의 다음 반복은 일치합니다.

  • \1= EMP|,
  • \2= 123|
  • \3= 10 123|INFO|JOHN|SMITH|M|01/12/1980 (첫 번째 반복에 삽입된 개행 문자 포함).

경고: 입력 줄의 \r두 번째 줄 앞에 가 있으면 혼동을 일으킬 수 있습니다 .|

관련 정보