bash / sed / awk / etc 다른 모든 줄 바꿈 제거


39

bash 명령은 다음을 출력합니다.

Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active

다음과 같이 보이도록 파이프를 연결하고 싶습니다.

Runtime Name: vmhba2:C0:T1:L14 Group State: active 
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]

즉, 다른 모든 줄 바꿈을 제거

나는 시도 ... |tr "\nGroup" " "했지만 그것은 모든 줄 바꿈을 제거하고 다른 문자도 먹었습니다. 감사


2
tr전적으로 문자 기반입니다. tr에 줄 바꾸기와 모든 'G', 'r', 'o', 'u'및 'p'를 제거하도록 요청했습니다.
glenn jackman 1

답변:


80

지금 테스트 할 수는 없지만

... | paste - - 

해야 돼


5
+1-작동하고 우아합니다. (줄 사이에 탭을 넣습니다. paste -d ' ' - -필요한 경우 공백을 추가합니다)
cyberx86

4
명령이 어떻게 작동하는지 설명해 주시겠습니까? 왜 두 가지가 -있습니까? 감사합니다
bbaja42

7
paste파일에서 해당 행을 연결하는 데 사용됩니다 paste file1 file2 file3 .... "file"인수 중 하나가 "-"이면 표준 입력에서 행을 읽습니다. "-"인수가 2 개이면 paste는 stdin에서 2 행을 사용합니다. 등등. 참조 매뉴얼 페이지를 .
glenn jackman 10

10

한 가지 가능성은 다음과 같습니다.

awk 'ORS=NR%2?" ":"\n"'

줄 번호를 2로 균등하게 나누면 줄 바꿈으로 끝나고 그렇지 않으면 공백으로 끝납니다.

(테스트 : CentOS 6, GNU Awk 3.1.7)

sed 사용 ( 설명 참조 ) :

sed ':a;N;$!ba;s/\nGroup/ Group/g'

더 읽을 거리 :


8

를 사용 sed하려면 전체 파일을 메모리로 읽어야 할 이유가 없습니다. 다음과 같이 다른 모든 줄을 병합 할 수 있습니다.

sed 'N;s/\n/ /' inputfile

공백 대신 원하는 문자를 사용하십시오.

awk를 사용하는 또 다른 방법이 있습니다.

awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile

if/else취급하는 파일의 행의 홀수가있는 경우. 이것이 없으면 홀수 마지막 줄이 두 번 인쇄됩니다. 그렇지 않으면 비교를 위해 다음을 수행 할 수 있습니다.

awk '{printf "%s", $0; getline; print " " $0}'

1
늦은 코멘트 : 1) 항상 문자열은 퍼센트 기호를,이 경우의 printf에 대한 형식 지정자를 사용하여 2)이, 마지막 줄을 중복 ""에 $ 0 설정 피하기 위해 -awk '{printf "%s", $0; $0=""; getline; print " " $0}'
글렌 잭맨

3

가장 관용적 인 방법 awk은 다음과 같습니다.

awk 'ORS=NR%2?FS:RS' file

출력합니다 :

Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active

이를 설명하기 위해 내장 변수 각각을 정의해야합니다.

  • RS레코드 구분 기호. 기본값은 \n(새 줄)입니다.
  • ORS출력 레코드 구분 기호. 기본값은 \n(새 줄)입니다.
  • FS필드 구분 기호. 기본값은 (공백)입니다.
  • NR 레코드 수

기본 레코드 구분 기호는 줄 바꾸기이므로 레코드는 기본적으로 줄입니다.

NR%2의 계수이며 NR/2이 중 하나가 될 것입니다 그래서, 01. 0짝수 줄과 1홀수 줄.

var=condition?condition_if_true:condition_if_false 삼항 연산자입니다.

ORS=NR%2?FS:RS출력 레코드 구분 기호를 정의 한다고 말하면 다음과 같습니다.

  • 레코드 수가 양식 2k + 1, 즉 짝수 라인에있는 경우 출력 레코드 구분 기호는 FS공백으로 설정됩니다.
  • 레코드 수가 양식 2k, 즉 홀수 ​​행인 경우 출력 레코드 구분 기호는 RS새 행으로 설정됩니다.

이런 방식으로 홀수 줄은 공백으로 끝나고 다음 줄과 연결됩니다. 그 줄 뒤에 새 줄이 인쇄됩니다.

관용적 인 awk에 대한 자세한 정보 .


2

이것은 Linux에서 나를 위해 작동합니다.

... | tr "\\n" " "

이것은 개행 문자의 빈 공간을 대체합니다. 당신은 해야한다 일들이 제대로 작동하려면 개행 문자를 탈출.


이렇게하면 다른 모든 줄 바꿈이 아니라 모든 줄 바꿈이 제거됩니다 .
Trenton

2

bash에서 :

... | while read l1; do read l2; echo "$l1 $l2"; done

1

Perl이 옵션 인 경우 :

perl -pe 's/\n/ / if $. % 2 == 1' file

s/\n/ /공간 개행 문자가 대체
$.행 번호입니다


-1

어때요 grep?

.. | grep -v '^Group State'

그것은 대체 라인을 제거합니다. OP는 그들을 추가하기를 원합니다.
Dennis Williamson

그래, 질문을 다시 읽은 후 나는 그것을 깨달았다 :)
pkhamre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.