공백으로 구분된 단어 모음의 출력을 수정해야 합니다. 이 컬렉션은 다음에서 제공됩니다.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'