.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
.