파일을 줄별로 분할하고 첫 번째 필드를 제거한 후 결과 조각의 이름으로 사용합니다.

파일을 줄별로 분할하고 첫 번째 필드를 제거한 후 결과 조각의 이름으로 사용합니다.

다음과 같은 텍스트 파일이 있습니다.

19-198-0000 NORTHANGER ABBEY
19-198-0001 THIS LITTLE WORK WAS FINISHED IN THE YEAR EIGHTEEN O THREE AND INTENDED FOR IMMEDIATE PUBLICATION IT WAS DISPOSED OF TO A BOOKSELLER IT WAS EVEN ADVERTISED
19-198-0002 NEITHER THE AUTHOR NOR THE PUBLIC HAVE ANY OTHER CONCERN THAN AS SOME OBSERVATION IS NECESSARY UPON THOSE PARTS OF THE WORK WHICH THIRTEEN YEARS HAVE MADE COMPARATIVELY OBSOLETE
19-198-0003 THE PUBLIC ARE ENTREATED TO BEAR IN MIND THAT THIRTEEN YEARS HAVE

등. 내가 원하는 것은 초기 파일과 동일한 줄 수로 더 작은 텍스트 파일을 만드는 방법입니다. 이름은 줄 시작 부분의 숫자이고 내용은 나머지입니다.

예를 들어, 위의 작은 조각에서:

19-198-0000.txt  would contain: NORTHANGER ABBEY
19-198-0001.txt  would contain: THIS LITTLE WORK WAS FINISHED IN THE YEAR EIGHTEEN O THREE AND INTENDED FOR IMMEDIATE PUBLICATION IT WAS DISPOSED OF TO A BOOKSELLER IT WAS EVEN ADVERTISED
19-198-0002.txt  would contain: NEITHER THE AUTHOR NOR THE PUBLIC HAVE ANY OTHER CONCERN THAN AS SOME OBSERVATION IS NECESSARY UPON THOSE PARTS OF THE WORK WHICH THIRTEEN YEARS HAVE MADE COMPARATIVELY OBSOLETE
19-198-0003.txt  would contain: THE PUBLIC ARE ENTREATED TO BEAR IN MIND THAT THIRTEEN YEARS HAVE

등.

답변1

while read -r tag line; do
    printf '%s\n' "$line" >"$tag".txt
done <text.in

두 변수 읽기를 사용하면 read첫 번째 단어가 첫 번째 변수에 배치되고 나머지 줄은 두 번째 변수에 배치됩니다.

"단어"의 구성은 의 값에 따라 달라집니다 $IFS. 기본적으로 read줄은 공백, 탭 또는 줄 바꿈을 기준으로 단어로 분할됩니다.

루프에서 사용하면 줄의 시작 부분에서 이름을 가져오는 파일에 줄(첫 번째 단어 또는 "태그" 제외)을 출력합니다.

답변2

bash전혀 필요하지 않습니다.

awk '{file = $1".txt"; $1=""; print substr($0,2) > file; close(file)}' a_text_file
  • file첫 번째 열에서 가져와 .txt그 뒤에 a를 추가합니다.
  • 첫 번째 열을 제거합니다.
  • 나머지 열(다른 선행 공백 제외)을 에 인쇄합니다 file.

한편, 해당 while루프 에 대해서는 다음과 같습니다 bash.

$ (echo first; echo -n second) | while read line; do echo $line; done
first
$ 

음, 자동 데이터 손실입니다. 있는지 확인하는 것이 좋습니다언제나마지막 개행 문자죠?

답변3

이 작업을 수행했습니다.

#!/bin/bash

while read -r filename content ; do
    printf '%s\n' "$content" >> "${filename}.txt"
done < some_file.txt

관련 정보