스트림에서 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'

관련 정보