从流中一次打印 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
...

使用下面的内容awk我可以用一个词来打破。它需要一些手动清理,但在其他方面添加到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 \
...

一旦我删除了前两个不需要的单词,它就会看起来像:

$ 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表达式,该表达式采用一串空格分隔的单词,删除前两个单词,然后以每行 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 \

请注意,我在最后一个词后面加了一个空格。

上面的命令删除前两个单词,然后以每行 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

答案2

另一种方法,不使用awk

 make sources | cut -f2- -d\: | xargs  -n 4 printf '%s %s %s %s \\\n'

相关内容