재귀적으로 반복되는 텍스트 줄 목록 생성 [닫기]

재귀적으로 반복되는 텍스트 줄 목록 생성 [닫기]

텍스트 파일을 확장하는 방법:

원본 텍스트 파일:

1
2
3
4
5
etc

원하는 확장 결과:

1
2
3
4
5
2
3
4
5
6
3
4
5
6
7
etc.

즉, 파일 1의 처음 5개 라인을 새로운 확장 파일 2에 나열한 다음 n+1에서 시작하여 5의 두 번째 블록을 추가하고 n+2에서 시작하는 세 번째 블록을 추가하는 식으로 파일 1의 끝까지 계속합니다.

답변1

이 줄을 한 번만 실행하세요.

awk 'NR>5{printf"%s",out;sub("^[^\n]+\n","",out)}{out=out$0"\n"}END{printf "%s",out}' file
  1. 물론 file파일 이름으로 바꾸십시오.

  2. awk입력을 한 줄씩 처리하고 그에 대해 "작동"하는 프로그램입니다.

  3. out=out$0\n변수를 만들고 out현재 줄을 변수에 추가한 다음 개행 문자를 추가합니다.

  4. NR>5{...}이는 "행 5보다 큰 레코드(예: 행)에 대해 중괄호 안의 작업을 수행합니다.

  5. printf "%s", out변수를 인쇄합니다 out.

  6. sub("^[^\n]+\n","",out)out여기서는 첫 번째 개행 문자의 시작 부분까지 빈 문자열로 바꾸는 삭제 명령으로 사용되는 대체 명령입니다.

  7. 출력을 두 번째 파일에 저장하려면 file2줄 끝에 ""> file2"를 추가하세요.

고쳐 쓰다:

또 다른 도구가 존재합니다 sed.스트림 편집기, 이는 더 짧지만 더 비밀스러운 솔루션을 제공합니다.

 sed -n '6,${x;p;s/^[^\n]\+\n//;x};H;1h;${x;p}' file
  1. 1h"예약된" 공간에 첫 번째 행을 배치합니다.

  2. H예약된 공간에 행을 추가합니다.

  3. 6,${x;p;s/^[^\n]\+\n//;x}, 6번째 줄부터 시작하여 예약된 공간을 현재 줄과 바꾸고 이를 인쇄한 다음 첫 번째 줄을 삭제하고 결과를 다시 예약된 공간으로 보냅니다.

  4. ${x;p}는 처리가 끝나면 예약된 공간(아마도 an g대신 a x)을 다시 가져와서 인쇄합니다.

답변2

# get number of lines in the file
n=$( wc -l <file )

# extend the file
awk -v n="$n" 'NR <= n { print $1+1 >>FILENAME }' file

이 두 명령을 필요한 만큼 여러 번 실행하세요.

프로그램 awk은 읽고 있는 동일한 파일에 해당 행을 추가합니다. 추가되는 데이터는 기존 숫자에 1을 더한 것입니다.

파일의 줄 수로 제한하지 않으면( 를 사용하여 NR <= n) 파티션을 채울 때까지 무한히 커집니다.

답변3

주어진 input파일 seq 10 > input:

1
2
3
4
5
6
7
8
9
10

다음은 파일의 행을 반복하여 5개의 각 블록을 인쇄합니다.

n=$(wc -l < input)
for((i=1; i <= n-4; i++)); do sed -n "$i,$((i+4))p" < input; done

다음으로 이어진다:

1
2
3
4
5
2
3
4
5
6
3
4
5
6
7
4
5
6
7
8
5
6
7
8
9
6
7
8
9
10

관련 정보