나는이 문제에 갇혀 있습니다.
다음과 같은 입력 파일이 있습니다.
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