이 형식의 텍스트 파일이 있다고 가정해 보겠습니다.
field1a
field2a
field3a
field1b
field2b
field3b
3개(또는 일반적으로 N개)의 연속 라인을 결합하고 싶습니다. sed
bash 쉘에서 다른 명령줄 유틸리티를 사용하여 이를 어떻게 수행합니까?
예상 출력
field1a:field2a:field3a
field1b:field2b:field3b
답변1
paste -sd '::\n' file
행이 elf -d인 경우 자체는 로 구분되고 file
개행 문자 는 해당 순서로 표시됩니다 .s
paste
:
:
d
<file paste -d : - - -
paste
stdin, stdin 및 stdin 행을 구분자 :
로 열고 d
stdin은 file
.
또는:
awk '{ORS=NR%3?":":"\n";print}' < file
출력 레코드 구분 기호는 개행 문자이거나 레코드(라인) 번호가 3의 배수인지 여부 O
에 따라 달라집니다 .R
S
:
R
N
(입력의 레코드 수가 3의 배수가 아닌 경우 이러한 방법은 다르게 작동합니다.)
답변2
출력 형식의 경우 다음을 사용할 수 있습니다.printf
IFS='
' # split on sequences of newline characters
set -f # disable globbing
printf "%s:%s:%s\n" $(cat file)
(빈 줄은 건너뜁니다.)
또는 sed
(원하는 경우)
sed '$!N;$!N;s/\n/:/g' file
답변3
그리고 sed
:
sed '$!N;$!N;y/\n/:/'
내 생각에는 이것이 더 나은 것 같지만N라인그 이상이어야합니다. 다음과 같이 행 수가 항상 필드 끝에 있도록 하려면 다음을 수행하십시오.
sed '$q;N;/1.$/!s/\(..*\)\(\n\)/\2\1:/;//P;D
' <<\INPUT
field1a
field1b
field2b
field1c
INPUT
산출
field1a
field1b:field2b
field1c
... then으로 끝나는 1
다른 줄을 만날 때까지 then의 단일 문자로 끝나는 줄을 쌓습니다 .1
발생 필드 수에 관계없이 작동하지만 다음을 원할 수도 있습니다.
sed '.../[^0-9]1.$/!...'
...여러 자리를 입력하는 경우.
답변4
수백 줄 이하이거나 그룹당 필드 수가 다른 경우에는 vi가 적합합니다.
vi에서 현재와 다음 2줄(총 3줄의 텍스트)을 결합하려면...
3J
이때 커서가 연결선에 있으니 다음으로 넘어가는데...
j
점을 사용하여 현재 줄을 동일하게 수정합니다.
.
그리고 또...
j
.
이런! 마지막 그룹에는 3개가 아닌 4개의 행이 있습니다. 최근 편집을 취소합니다...
u
그러다 이번에 또 하게 되는데...
4J
다음! ...
j
……등.
3억 6천만 개 필드의 데이터베이스 로드에 대해 이 작업을 수행할 계획이거나 연속 필드가 일반적으로 3개이고 몇 개의 그룹이 4개, 몇 개의 그룹이 5~6개일 경우 다음을 수행해야 할 수 있습니다. 난해한 구문을 견디고, 루프에서 벗어나고, 단계별로 데이터를 조정하고, 이를 테스트하고 오류를 경고하는 프로그램을 작성할 수도 있습니다.
하지만 작은 일회성 작업이라면 몇 분 동안 지루함을 견디고 vi를 사용하면 됩니다.