Unix 스크립트는 파일을 읽고 각 줄마다 하나씩 생성합니다.

Unix 스크립트는 파일을 읽고 각 줄마다 하나씩 생성합니다.

파일이 있고 내 작업은 파일을 읽고 각 줄에 대해 새 파일을 생성하는 것입니다. 새로 생성된 파일의 이름은 이 줄의 내용에서 나와야 합니다.

파일에는 다음 두 줄이 있습니다.

My name is hello world
My Name is not hello world

내가 원하는 것은 파일 1에 파일 이름이 줄의 네 번째 필드인 1개의 레코드가 있어야 한다는 것입니다.

정확히 무슨 뜻인가요?

첫 번째 파일 이름은 다음과 같아야 합니다.

hello

파일 2에는 두 번째 레코드가 있어야 하고 파일 이름은 행의 4개 필드여야 하지만 그렇지 않습니다.

여기도 마찬가지입니다. 정확히 무슨 뜻인가요?

두 번째 파일의 이름은 다음과 같아야 합니다.

not

답변1

$cat mainfile
My name is hello world
My Name is not hello world

존재하다bash

#!/bin/bash
cat mainfile | while IFS= read line ;do 

name=$(echo ${line} | awk '{print $4}')

echo "${line}" >> ${name} 
done

존재하다csh

#!/bin/csh
foreach line ( "`cat mainfile`" )
set name = `echo ${line} | awk '{print $4}'`

    echo "${line}" >> $name
end

기본 파일의 모든 단어에 대한 파일을 만들려면

#!/bin/bash
cat mainfile | while IFS= read line ;do

     for word in $line; do

   echo "${line}" >> ${word} 
  done
done

답변2

파일의 행은 공백으로 구분된 네 번째 필드에서 이름을 가져온 파일에 기록되어야 합니다. "기록"이라는 단어는 한 줄을 의미합니다. "필드" 대신 "열"이라는 단어가 사용되는 경우가 있는데, 여기서 "필드" 대신 "워드"라는 단어를 사용할 수 있습니다. "레코드"와 "필드"는 모두 "행"과 "열"(또는 "단어")보다 더 일반적입니다. 특히 행은 줄 바꿈으로 구분된 레코드이고 "필드"는 일반적으로 공백으로 구분된 열 또는 레코드 내의 단어입니다.

그리고 awk:

awk '{ print >$4 }' <file.txt

그러면 print입력 파일의 각 행에 대해 명령문이 한 번씩 실행 됩니다 file.txt. 이는 >$4출력이 해당 줄의 네 번째 필드 이름이 지정된 파일로 리디렉션됨을 의미합니다. 첫 번째 줄에서는 파일이 생성되고 hello두 번째 줄에서는 파일이 생성됩니다 not.

$ cat hello
My name is hello world
$ cat not
My Name is not hello world

파일에 더 많은 줄이 있으면 각 줄은 네 번째 단어가 지정된 파일에 기록됩니다. 두 줄 모두에 있는 경우동일한네 번째 단어, 두 줄이 동일한 파일에 기록됩니다.

한 줄에 4개 단어 미만이 있으면 오류가 발생합니다.

awk달리 명시하지 않는 한, 기본 레코드 구분자로 개행 문자를 사용하고 필드 구분자로 공백(탭 또는 공백)을 사용하십시오.


고급성 awk:

프로그램에서 이러한 리디렉션을 수행하면 awk모든 awk데이터를 읽은 후 종료될 때까지 파일이 열린 상태로 유지됩니다. 열려 있는 각 파일에는 파일 설명자가 필요하며 파일 설명자 수는 제한되어 있습니다. 만약에많은파일을 작성해야 하며 파일을 명시적으로 닫는 것이 가장 좋습니다.

awk '{ print >>$4; close($4) }' <file.txt

여기서는 잘라내거나 덮어쓰는 대신 추가할 출력을 열고 현재 줄을 파일에 쓴 다음 파일을 닫습니다. 동일한 파일이 출력을 위해 두 번째로 열리면(필드 4가 두 개 이상의 라인에서 동일하기 때문에) 데이터가 추가됩니다. 를 사용하면 >$4새 데이터가 이전 데이터를 덮어씁니다. 파일을 명시적으로 닫지 않기 때문에 맨 위의 첫 번째 프로그램에서는 문제가 되지 않습니다.

스크립트(또는 awk프로그램을 호출하는 모든 프로그램)는 실행하기 전에 상황에 따라 출력 파일을 비어 있거나 존재하지 않도록 설정해야 합니다.

파일을 삭제 hello하고 not위 명령을 세 번 실행합니다.

$ rm hello not
$ awk '{ print >>$4; close($4) }' <file.txt
$ awk '{ print >>$4; close($4) }' <file.txt
$ awk '{ print >>$4; close($4) }' <file.txt
$ cat hello
My name is hello world
My name is hello world
My name is hello world
$ cat not
My Name is not hello world
My Name is not hello world
My Name is not hello world

관련 정보