열 n에 행 만들기 마지막 행에 개행 문자 삽입

열 n에 행 만들기 마지막 행에 개행 문자 삽입

.txt 파일이 있습니다

john,
5901,
open

lina,
2401,
open

jody,
5401,
open

각 행의 끝에 새 행을 삽입하고 싶습니다. 결과는 다음과 같습니다.

john,5901,open
lina,2401,open
jody,5401,open

내가 뭘 시도하는지

cat file.txt | tr -d '\n'

그런데 결과는 이렇다

john,5901,openlina,2401,openjody,5401,open

답변1

awk 사용단락 모드:

$ awk -vRS= -vOFS= '{$1=$1} 1' file.txt
john,5901,open
lina,2401,open
jody,5401,open

레코드 구분 기호를 설정하지 않으면 RS=awk는 빈 줄 사이의 모든 내용을 단일 레코드로 처리하고 빈 입력 필드 구분 기호의 기본 목록에 줄 바꿈을 추가합니다. 입력에 다른 공백이 포함되어 있지 않으므로 이는 블록의 각 줄이 필드가 됨을 의미합니다. 그런 다음 필드 값을 자체에 다시 할당하여 레코드를 강제로 재평가하고 마지막으로 기본 단일 공백 ​​대신 빈 출력 필드 구분 기호를 사용하여 레코드를 인쇄합니다 $1=$1.OFS=

답변2

$ paste -d '\0' - - - - <file
john,5901,open
lina,2401,open
jody,5401,open

입력 파일의 각 행을 다음 열에 배치하여 데이터를 4개 열로 다시 포맷합니다. 섹션 사이의 빈 행은 네 번째 열로, 각 출력 행의 끝에 배치되지만 비어 있으므로 아무 것도 포함되지 않습니다.

데이터에는 이미 쉼표가 포함되어 있으므로 null 구분 기호 paste( -d '\0')를 사용합니다.


이 방법을 사용하는 솔루션 sed에서는 데이터가 세 개의 행 그룹으로 나누어져 있다고 가정하지 않습니다.

$ sed -n 'H; /^$/{x;s/\n//g;p;d;}; ${x;s/\n//g;p;}' file
john,5901,open
lina,2401,open
jody,5401,open

예약된 공간에 줄을 추가하여 이를 수행하고 H, 빈 줄이나 파일의 끝을 만나면 H추가된 예약된 공간에 포함된 줄 바꿈을 제거하고 결과를 인쇄합니다.

답변3

그리고awk

awk '{ printf (NF)?$0:RS } END{ print ""}' infile

각 줄이 빈 줄(탭, 공백 및 개행 문자 집합을 포함하는 줄)이 아닌 경우 단일 줄로 연결됩니다.

이 솔루션은 각 그룹의 고정된 3개 회선에 의존하지 않습니다.

특정한 경우에 빈 행이 여러 개 있고 결과가 중복되지 않도록 하려면 다음을 수행할 수 있습니다.

awk 'NF{ skip=0; printf $0; next} !skip{ printf RS; skip=1 } END{ print ""}' infile

답변4

POSIXly sed를 사용하는 한 가지 방법은 다음과 같습니다.

sed -e '
    /./!d
    $ba
    N
    /\n$/!{H;s/.*//;x;D;}
    :a;s/\n//g
' input.txt

입력하다:

% cat -ne input.txt
 1  $
 2  $
 3  john,$
 4  5901,$
 5  open$
 6  $
 7  $
 8  $
 9  lina,$
10  2401,$
11  open$
12  $
13  jody,$
14  5401,$
15  open$

산출:

john,5901,open
lina,2401,open
jody,5401,open

설명하다:

  • sed비어 있지 않은 줄(모든 문자, 심지어 공백도 가능)을 볼 때마다 이를 패턴 공간에 추가하기 시작하고 다음 줄을 읽습니다.
  • 이제 패턴 공간의 가장 오른쪽 부분(패턴 공간으로 읽은 현재 줄이 빈 줄 또는 마지막 줄이라는 의미)이면 label 로 분기하고 :a즉시 패턴 공간에서 개행 문자를 제거하고 표준으로 인쇄합니다. 산출.
  • 방금 읽은 줄이 완전히 비어 있지 않으면 패턴 공간에 추가한 후 /\n$/다시 돌아가서 다음 줄을 추가합니다. 코드 상단에 있는 명령 으로 제어권을 전달하여 D이를 수행합니다 sed. 하지만 그 전에는 패턴 공간의 첫 번째 개행까지 모든 것을 정리합니다. 우리는 인공물을 \n배치 하여 이를 관리합니다 H;s/.*//;x.

관련 정보