다음과 같이 내부 캐리지 리턴으로 구분된 줄이 있는 파일이 있습니다.
전자기 펄스|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
두 번째 줄 앞에 가 있으면 혼동을 일으킬 수 있습니다 .|