ストリームからN個のレコードを一度に印刷する

ストリームからN個のレコードを一度に印刷する

スペースで区切られた単語のコレクションの出力を変更する必要があります。このコレクションは以下で提供されます。GNUmakefileコンパイルに使用されたソースファイルを印刷します。

$ make sources
Library sources: cryptlib.cpp cpu.cpp integer.cpp 3way.cpp adler32.cpp algebra.c
pp algparam.cpp arc4.cpp aria-simd.cpp aria.cpp ariatab.cpp asn.cpp authenc.cpp
...

以下の内容を使用すると、awk1つの単語に分けることができます。いくつかの手動クリーンアップが必要ですが、そうでなければ追加されます。Makefile.am自動ツールの場合:

$ make sources | awk '{print "    " $0 " \\"}' RS=' '
    Library \
    sources: \
    cryptlib.cpp \
    cpu.cpp \
    integer.cpp \
    ...

これを4〜8単語に拡張しようとすると、いくつかの問題が発生します。

$ make sources | awk '{print "    " $0 $1 $2 $3 " \\"}' RS=' '
    LibraryLibrary \
    sources:sources: \
    cryptlib.cppcryptlib.cpp \
    cpu.cppcpu.cpp \
    integer.cppinteger.cpp \

私の最初の質問は、「awkはこれに適したツールですか?それとも別のものを使用する必要がありますか?」です。

次の質問は、4 または 8 など、必要な数のレコードを印刷し、改行で区切るにはどうすればよいですか。


残念です...必要な出力が明確ではありません。一方:

$ make sources
Library sources: cryptlib.cpp cpu.cpp integer.cpp 3way.cpp adler32.cpp algebra.c
pp algparam.cpp arc4.cpp aria-simd.cpp aria.cpp ariatab.cpp asn.cpp authenc.cpp

私は以下が欲しいが、それでも修正が必要です(しかし満足しています):

$ make sources | awk ...
Library sources: cryptlib.cpp cpu.cpp \
integer.cpp 3way.cpp adler32.cpp algebra.cpp \
algparam.cpp arc4.cpp aria-simd.cpp aria.cpp \
...

不要な最初の2つの単語を削除すると、次のようになります。

$ make sources | awk ...
cryptlib.cpp cpu.cpp \
integer.cpp 3way.cpp adler32.cpp algebra.cpp \
algparam.cpp arc4.cpp aria-simd.cpp aria.cpp \
...

ベストアンサー1

awkコメントの議論によれば、スペースで区切られた単語文字列を取り、最初の2つの単語を削除してから、残りを1行に4〜8個ずつグループとして印刷する式を作成したいようです。すべての行(最後の行を除く)はバックスラッシュで終わります。次の例を考えてみましょう。

echo "a b 1 2 3 4 5 6 7 8 " | \
cut -d' ' -f3- \
| awk '{printf $0 " "} NR%4==0 {print "\\"}' RS=' '

これにより、次のような出力が生成されます。

1 2 3 4 \
5 6 7 8 \

最後の単語の後にスペースを追加しました。

上記のコマンドは最初の2つの単語を削除し、残りの単語を1行に4つの単語のグループとして印刷します。各行の後にはバックスラッシュが続きます。この方法を使用するようにコマンドを変更すると、次の結果が生成されます。

{ make sources; printf ' '; } | \
cut -d' ' -f3- \
| awk '{printf $0 " "} NR%4==0 {print "\\"}' RS=' '

makeもしかしたら - 出力の後にスペースを追加しました。

潜在的な選択肢について質問したので、awk私は個人的にこの種の作業にPythonを使用することを好むと述べています。以下は、問題を解決するPythonスクリプトです。

#!/usr/bin/env python2

# chunk.py

import sys

# Read the data from standard input
words = sys.stdin.readline().split()[2:]

# Set the chunk size
n = 4

# Break up the data into chunks
chunks = []
for i in range(0, len(words), n):
    chunks.append(' '.join(words[i:i+n]))

# Print out the reformatted data
print(' \\\n'.join(chunks))

ファイル(例:)に入れてchunk.py実行します。

echo -e "a b 1 2 3 4 5 6 7 8" | python chunk.py

これにより、次のような出力が生成されます。

1 2 3 4 \
5 6 7 8

おすすめ記事