파일이 있고 내 작업은 파일을 읽고 각 줄에 대해 새 파일을 생성하는 것입니다. 새로 생성된 파일의 이름은 이 줄의 내용에서 나와야 합니다.
예
파일에는 다음 두 줄이 있습니다.
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