한 파일의 이름을 사용하여 한 번에 여러 파일을 만들고 싶습니다 list.txt
. 어떻게 해야 합니까?
샘플 list.txt
:
EOG090W002U
EOG090W00C1
EOG090W00DC
EOG090W00DE
EOG090W00E5
EOG090W00HR
EOG090W00MH
EOG090W00MS
EOG090W00PB
EOG090W00U4
EOG090W00UK
EOG090W00WM
EOG090W00WR
list.txt
일부 ID 번호가 포함된 이것이 있다고 가정해 보겠습니다 . 이제 이러한 ID를 이름으로 사용하여 별도의 파일을 만들고 싶습니다(예: , , EOG090W002U_M0.ctl
). 또한 그에 따라 파일의 내용도 변경되어야 합니다. 예를 들어 파일의 내용은 다음과 같습니다.EOG090W00C1_M0.ctl
EOG090W00DC_M0.ctl
EOG090W002U_M0.ctl
EOG090W00C1_M0.ctl
seqfile = EOG090W002U_p.phy
treefile = Constant.txt
outfile = EOG090W002U_M0_mlc
또는
seqfile = EOG090W00C1_p.phy
treefile = Constant.txt
outfile = EOG090W00C1_M0_mlc
*.phy
와 Constant.txt
같은 폴더에서 사용할 수 있습니다 .
답변1
제일 쉬운:
xargs touch <List.txt
마술은 xargs
표준 입력의 모든 줄을 가져와 명령에 인수로 추가한다는 것입니다.
답변2
스크립트에서 GNU 병렬 처리 사용:
#!/bin/bash
constant=constant
populate_file () {
local const=$1
local file=$(basename -s '.M0.ctl' "$2")
printf '%s\n%s\n%s\n' \
"seqfile = ${file}_p.phy" \
"treefile = ${const}.txt" \
"outfile = ${file}_M0_mlc" > "$2"
}
export -f populate_file
parallel populate_file "$constant" {}.M0.ctl :::: list.txt
그러면 각 행의 행을 병렬로 읽고 list.txt
함수가 실행됩니다. populate_file
이 populate_file
함수는 원하는 형식으로 각 파일에 세 줄을 출력합니다.
GNU 병렬 처리가 없으면 읽는 동안 루프를 사용할 수 있습니다.
#!/bin/bash
constant=constant
populate_file () {
local const=$1
local file=$(basename -s '.M0.ctl' "$2")
printf '%s\n%s\n%s\n' \
"seqfile = ${file}_p.phy" \
"treefile = ${const}.txt" \
"outfile = ${file}_M0_mlc" > "$2"
}
while IFS= read -r file; do
populate_file "$constant" "${file/ /}.M0.ctl"
done < list.txt
답변3
다음과 같이 시도해 볼 수 있습니다.
for i in $(cat list.txt); do touch $i; done
답변4
#!/bin/bash
tr -d '[:blank:]' < list.txt > outputFile.tmp
for i in $(cat outputFile.tmp)
do
echo "seqfile = ${i}_p.phy" >> ${i}_M0.ctl
echo "treefile = constant.txt" >> ${i}_M0.ctl
echo "outfile = ${i}_M0_mlc" >> ${i}_M0.ctl
done
exit 0
설명하다:
tr -d '[:blank:]' < list.txt > outputFile.tmp
목록에서 공백을 제거하고 복사합니다.outputFile.tmp
for
파일의 모든 줄을 반복하고outputFile.tmp
파일을 동적으로 생성하여 필요한 컨텍스트를 파일에 추가합니다.