텍스트 파일에서 행을 읽고 각 행의 각 이름에 대한 텍스트 파일 작성


21

다음과 같은 텍스트 파일이 있다고 가정 해 봅시다.

john
george
james
stewert

모든 이름은 별도의 줄에 있습니다.

나는이 텍스트 파일의 라인을 읽고처럼, 각각의 이름에 대한 텍스트 파일을 만들려면 : john.txt, george.txt

Bash에서 어떻게 할 수 있습니까?


2
확장이 필요합니까? Linux에서 텍스트 파일의 확장자가 txt 인 이유는 없습니다.
terdon

답변:


18

# 1 배쉬 + 사용 touch:

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in: 이것은 파일의 끝에 도달 할 때 발생하는 자체 반환 read할 때까지 실행됩니다 . 경로 재 지정 으로 인해 터미널 대신 현재 작업 디렉토리에 이름이 지정된 파일에서 입력을 읽습니다 .read1readin<in
  • touch "$line.txt"이 실행 touch의 확장 된 값에서 $line.txt의 함유량이다 line하였다 .txt; touch존재하지 않는 경우 파일을 작성하고 존재하는 경우 액세스 시간을 업데이트합니다.

사용 # 2 xargs+ touch:

xargs -a in -I name touch name.txt
  • -a in: 현재 작업 디렉토리에 xargs이름이 지정된 파일에서 입력을 읽습니다 in.
  • -I name: 다음 명령에서 xargs발생하는 모든 name현재 행을 대체합니다 .
  • touch name: touch대체 된 값인 name; 존재하지 않는 경우 파일을 작성하고 존재하는 경우 액세스 시간을 갱신합니다.
% ls
in
% cat in
john
george
james
stewert
% while read line; do touch "$line.txt"; done <in
% ls
george.txt  in  james.txt  john.txt  stewert.txt
% rm *.txt
% xargs -a in -I name touch name.txt
% ls
george.txt  in  james.txt  john.txt  stewert.txt

어떻게 것입니다 read line실제로 라인을 읽어? @kos
kashish

@kashish <indone차종 readwhile루프 조건에서 읽고 저장 한 행 in에서 line각 반복하는 단계; 이런 식으로 touch "$line.txt"루프 내부 .txt가 끝에 있는 읽기 라인으로 확장됩니다 .
kos

것입니다 while read line; do touch "$line.txt"; done <in혼자 일을? 소스 파일은 어디에 있습니까?
kashish

@kashish 물론, 그들은 대안적인 방법입니다 : 당신은 둘 중 하나를 사용해야합니다.
kos

1
@kashish 그것이 read작동 하는 방식입니다. 참조하십시오 help read.
terdon

18

이 특정 경우, 한 줄에 하나의 단어 만있는 경우 다음을 수행 할 수도 있습니다.

xargs touch < file

파일 이름에 공백이 포함될 수 있으면이 오류가 발생합니다. 이러한 경우 대신 다음을 사용하십시오.

xargs -I {} touch {} < file

재미를 위해 여기에 공백이있는 줄을 포함하여 임의의 파일 이름을 처리 할 수있는 몇 가지 다른 방법이 있습니다.

  • perl -ne '`touch "$_"`' file
  • 어 wk

    awk '{printf "" > $0}' file 

Linux 및 유사한 시스템에서 확장은 대부분의 파일에 대해 선택 사항입니다. .txt텍스트 파일에 확장자를 추가 할 이유가 없습니다 . 당신은 자유롭게 할 수 있지만 전혀 차이가 없습니다. 따라서 확장을 원한다면 다음 중 하나를 사용하십시오.

xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file 

7

이 작업에는 AWK도 적합합니다.

testerdir:$ awk '{system("touch "$0)}' filelist

testerdir:$ ls
filelist  george  james  john  stewert

testerdir:$ awk '{system("touch "$0".txt")}' filelist                          

testerdir:$ ls
filelist  george.txt  james.txt  john.txt  stewert.txt
george    james       john       stewert

다른 방법은 tee. 줄이 파일 목록에 둘 이상의 문자열을 포함하는 경우이 방법이 중단됩니다.

testerdir:$ echo "" | tee $(cat filelist)


testerdir:$ ls
filelist  george  james  john  stewert

</dev/null tee $(cat filelist)파이핑을 피하려면 다른 방법 으로도 수행 할 수 있습니다.

cp /dev/null 접근 방식 (이것은 공백이 포함 된 파일 이름으로 작동합니다) :

testerdir:$ cat filelist | xargs -I {}  cp /dev/null  "{}"                     

testerdir:$ ls
filelist  FILE WITH SPACES  george  james  john  stewert

testerdir:$ ls FILE\ WITH\ SPACES                                              
FILE WITH SPACES

1
@kos 파일의 각 줄에 줄당 정확히 하나의 문자열이 들어 있으면 줄당 파일을 만듭니다. 효과적으로 동일합니다 echo "" | tee file1 file2 file2. 그러나 파일 이름에 공백이 있으면 중단됩니다.
Sergiy Kolodyazhnyy

7

텍스트 파일이 있다고 가정 해 보겠습니다.

대답이 있습니다 .)

awk '{system("touch \""$0".txt\"")}' file

공간과 접미사로도 방수 처리 =)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.