문자열을 일치시키고 한 줄을 이전 줄로 이동합니다.

문자열을 일치시키고 한 줄을 이전 줄로 이동합니다.

이 정보가 반복되는 대용량 파일이 있습니다. 불행하게도 고정된 터미널을 사용하여 파일을 래핑합니다. 무엇이든 일치시켜 172위 행으로 이동해야 합니다.

wsmith 623456256 6-meg
   172.16.15.198 pppoe

출력은 다음과 같아야합니다.

wsmith 623456256 6-meg  172.16.15.198 pppoe

파일에 형식이 올바르지 않은 다른 줄이 있기 때문에 awk를 사용할 수 없으며 단순히 두 번째 줄을 이동합니다.

답변1

그리고 sed:

sed '/^[[:blank:]]*172/ !{ N;s/\n[[:blank:]]*/ /; };' infile

답변2

ed편집기를 사용하면 이 명령은 g/172/-1,.j(하위)문자열을 포함하는 모든 줄을 이전 줄과 172연결합니다 .

다음은 ,p전체 버퍼를 표준 출력으로 인쇄합니다(그리고 Q저장하지 않고 종료합니다).

$ cat file
wsmith 623456256 6-meg
   172.16.15.198 pppoe
$ printf '%s\n' 'g/172/-1,.j' ',p' 'Q' | ed -s file
wsmith 623456256 6-meg   172.16.15.198 pppoe

보다 구체적으로 일치하려면 선택적 공백 및/또는 탭 및 문자열로 시작하는 줄만 일치시키세요 172..

$ printf '%s\n' 'g/^[[:blank:]]*172\./-1,.j' ',p' 'Q' | ed -s file
wsmith 623456256 6-meg   172.16.15.198 pppoe

새 파일에 저장하려면 결과를 리디렉션하세요. 내부 편집의 경우 ,pQ명령을 단일 wq명령으로 바꾸십시오.

답변3

이렇게 하면 필요한 작업이 수행됩니다.

문서:

wsmith 623456256 6-meg
 172.16.15.198 pppoe
wfwe fw efwe fw ef
fkp e
kswsmith 623456256 6-meg
  172.16.15.198 pppoe
wsmith 623456256 6-meg
  172.16.15.198 pppoe
ef
efwef w ef w efwef
wewsmith 623456256 6-meg
 172.16.15.198 pppoe
efwef
uiwsmith 623456256 6-meg
172.16.15.198 pppoe
awk 'BEGIN{set=0} NR>1 && /^ *172/{ print line,$0; set=1; next }
 NR>1 && !/^ *172/ && set==0{print line} {line=$0; set=0}' file

산출:

wsmith 623456256 6-meg  172.16.15.198 pppoe
wfwe fw efwe fw ef
fkp e 
kswsmith 623456256 6-meg   172.16.15.198 pppoe
wsmith 623456256 6-meg   172.16.15.198 pppoe
ef
efwef w ef w efwef
wewsmith 623456256 6-meg  172.16.15.198 pppoe
efwef
uiwsmith 623456256 6-meg 172.16.15.198 pppoe

관련 정보