4줄의 블록을 하나로 결합합니다. [중복]

4줄의 블록을 하나로 결합합니다. [중복]

나는이 문제에 갇혀 있습니다.

다음과 같은 입력 파일이 있습니다.

16:20:03 Buy
DRIP
AMEX
500 13,51 USD
16:05:10 Sell
SQ
NYSE
100 36,32 USD
15:48:52 Sell
NXTD
Nasdaq
500 4,99 USD
15:48:52 Sell
NXTD
Nasdaq
500 4,99 USD
15:46:07 Buy
SOXL
AMEX
50 147,7209 USD
15:40:20 Buy
TEUM
AMEX
1 700 1,36 USD
15:40:19 Buy
TEUM
AMEX
300 1,36 USD

내 목표는 각 4개 행 레코드를 한 줄에 넣는 것입니다.

16:20:03 Buy DRIP AMEX 500 13,51 USD
16:05:10 Sell SQ NYSE 100 36,32 USD

레코드당 4개의 행이 있다는 것을 알고 있습니다. 또한 각 레코드가 hh:mm:ss 형식의 시간으로 시작(구분됨)된다는 것도 알고 있습니다.

RS/FS OFS/ORS를 지정하는 다양한 awk 명령을 시도했습니다. 다음과 같은 sed의 다양한 변형을 시도했습니다.

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

awk는 첫 번째 레코드만 인쇄합니다. sed는 모든 요소를 ​​같은 줄에 넣을 수 없습니다

내가 시도한 것의 더 구체적인 예를 게시할 수 있습니다. 정말 단순해 보입니다. 누구든지 나에게 힌트를 줄 수 있습니까?

다른 언어로 된 더 간단한 해결책을 알고 있다면 자유롭게 설명해주세요.

답변1

페이스트를 사용하세요

    $ paste -d' ' - - - - <file
    16:20:03 Buy DRIP AMEX 500 13,51 USD
    16:05:10 Sell SQ NYSE 100 36,32 USD
    15:48:52 Sell NXTD Nasdaq 500 4,99 USD
    15:48:52 Sell NXTD Nasdaq 500 4,99 USD
    15:46:07 Buy SOXL AMEX 50 147,7209 USD
    15:40:20 Buy TEUM AMEX 1 700 1,36 USD
    15:40:19 Buy TEUM AMEX 300 1,36 USD

sed 사용

    $ sed 'N;N;N; s/\n/ /g' file
    16:20:03 Buy DRIP AMEX 500 13,51 USD
    16:05:10 Sell SQ NYSE 100 36,32 USD
    15:48:52 Sell NXTD Nasdaq 500 4,99 USD
    15:48:52 Sell NXTD Nasdaq 500 4,99 USD
    15:46:07 Buy SOXL AMEX 50 147,7209 USD
    15:40:20 Buy TEUM AMEX 1 700 1,36 USD
    15:40:19 Buy TEUM AMEX 300 1,36 USD

awk를 사용하세요

    $ awk '{line=line " " $0} NR%4==0{print substr(line,2); line=""}' file
    16:20:03 Buy DRIP AMEX 500 13,51 USD
    16:05:10 Sell SQ NYSE 100 36,32 USD
    15:48:52 Sell NXTD Nasdaq 500 4,99 USD
    15:48:52 Sell NXTD Nasdaq 500 4,99 USD
    15:46:07 Buy SOXL AMEX 50 147,7209 USD
    15:40:20 Buy TEUM AMEX 1 700 1,36 USD
    15:40:19 Buy TEUM AMEX 300 1,36 USD

답변2

펄 솔루션

perl -pe 's/\n/ / if $. % 4' < file
  • -p입력을 한 줄씩 읽고 처리한 후 다시 출력으로 인쇄합니다.
  • $.입력 줄 번호를 포함합니다.
  • s/\n/ /개행 문자를 공백으로 바꾸기
  • %모듈로 연산자이므로 조건은 "행 번호가 4로 나누어지지 않는 경우"입니다.

답변3

가장 간단한 해결책은 다음과 같습니다.ex, vi(지금 바로POSIX에 의해 지정됨).

printf '%s\n' 'g/^/j4' x | ex input.txt

동등하게:

printf 'g/^/j4\nx\n' | ex input.txt

설명하다:

printf명령은 단순히 다음 명령인 다음 출력을 생성합니다 ex.

g/^/j4
x

x명령은 저장하고 종료한다는 의미입니다. %p수정된 파일을 표준 출력으로 인쇄하려면 다음으로 바꾸십시오.아니요변경 사항을 저장합니다(테스트용으로 좋음).

g정규식( /^/물론 이 경우 모든 줄과 일치함)을 취하는 전역 명령이며 그 뒤에 명령이 옵니다. 명령은 정규식과 일치하는 모든 줄에서 실행됩니다.

j4현재 라인을 다음 세 라인과 연결하는 것을 나타냅니다. 연결 시 사이에 공백을 추가하세요.


시작 vi하고 입력 4J한 다음 j한 줄 아래로 입력 .하고 한 j줄 아래로 입력하는 .등의 작업을 수행할 수도 있습니다. 그러나 ex파일 끝에 남아 있는 줄(4개 미만) 의 경우 이 J명령 의 vi경우에는 그렇지 않습니다 .

답변4

$ awk '{printf $0 (NR%4?" ":"\n")}' file1
16:20:03 Buy DRIP AMEX 500 13,51 USD
16:05:10 Sell SQ NYSE 100 36,32 USD
15:48:52 Sell NXTD Nasdaq 500 4,99 USD
15:48:52 Sell NXTD Nasdaq 500 4,99 USD
15:46:07 Buy SOXL AMEX 50 147,7209 USD
15:40:20 Buy TEUM AMEX 1 700 1,36 USD
15:40:19 Buy TEUM AMEX 300 1,36 USD

관련 정보