我需要修复空格分隔的单词集合的输出。该集合来自于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'