4行のブロックを1つにまとめます。 [重複]

4行のブロックを1つにまとめます。 [重複]

私はこの問題に閉じ込められています。

次の入力ファイルがあります。

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行のレコードを1行に入れることです。

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ソリューション

perl -pe 's/\n/ / if $. % 4' < file
  • -p入力を1行ずつ読み、処理してから、出力に印刷します。
  • $.入力行番号を含みます。
  • s/\n/ /改行文字をスペースに置き換える
  • %モジュロ演算子なので、条件は「行番号が 4 で除算されない場合」です。

答え3

最も簡単な解決策は次のとおりです。exvi(今すぐ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現在の行を次の3つの線に関連付けることを示します。接続時にスペースを追加します。


開始してvi入力した後、1行下に入力して1行下に入力するなどの操作を実行することもできます。ただし、ファイルの末尾に残っている行(4行未満)の場合、このコマンドの場合はそうではありません。4Jj.j.exJvi

答え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

関連情報