두 개의 열이 있는 텍스트 파일이 있습니다. 한 열은 현재 파일 이름을 나타내고 다른 열은 파일의 최종 이름으로 원하는 이름을 나타냅니다. 텍스트 파일은 다음과 같습니다.
JALAZR010000001.1 - CM040670.1
JALBAP010000001.1 - CM040694.1
JALBBH010000001.1 - CM040712.1
JALBAZ010000001.1 - CM040704.1
JALBBR010000001.1 - CM040722.1
JALBBU010000001.1 - CM040725.1
JALAZL010000001.1 - CM040664.1
JALBAE010000001.1 - CM040680.1
파일은 다음 위치에 있습니다.
Genomic_data/Mito/CDS/Fungi/JALAZR010000001.1.gb
나는 비슷한 것을 시도했습니다 :
awk -F" - " '{print $1, $2}' filename.txt | mv Genomic_data/Mito/CDS/Fungi/{$1}.gb Genomic_data/Mito/CDS/Fungi/{$2}.gb
하지만 저는 숙련된 bash 프로그래머가 아니기 때문에 두 개의 awk 출력을 mv 프로그램에 파이프하는 방법에 대한 조언을 주시면 정말 감사하겠습니다(한 번은 할 수 없었습니다). 예상되는 출력은 다음과 유사합니다.
Genomic_data/Mito/CDS/Fungi/CM040670.1.gb
시간 내 주셔서 감사합니다.
추신 - 다른 대체 예제도 좋을 것입니다.
답변1
제안한 구문에 가까운 것을 사용할 수 있습니다GNU 병렬awk 대신에, 예를 들어
$ parallel --colsep ' - ' echo mv -n -- Genomic_data/Mito/CDS/Fungi/{1}.gb Genomic_data/Mito/CDS/Fungi/{2}.gb :::: filename.txt
mv -n -- Genomic_data/Mito/CDS/Fungi/JALAZR010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040670.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBAP010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040694.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBBH010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040712.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBAZ010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040704.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBBR010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040722.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBBU010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040725.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALAZL010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040664.1.gb
mv -n -- Genomic_data/Mito/CDS/Fungi/JALBAE010000001.1.gb Genomic_data/Mito/CDS/Fungi/CM040680.1.gb
echo
올바른 일을 하고 있다는 확신이 들면 제거하세요.
답변2
bash가 준비된 파일을 읽고 명령 mv
(경로 접두사 포함)을 빌드하는 내 버전은 다음과 같습니다. 스크립트에서는 입력 파일 이름이 이전/새 파일 이름이 포함된 "infile"이라고 가정하지만 이는 쉽게 변경할 수 있습니다.
#!/usr/bin/env bash
my_input_file='infile'
rename_path="Genomic_data/Mito/CDS/Fungi"
while read -r old_fname discard new_fname
do
mv "${rename_path}/${old_fname}.gb" "${rename_path}/${new_fname}.gb"
done < "${my_input_file}"
이 read
작업은 입력 파일의 행을 공백으로 분할하여 세 개의 필드를 생성하며 각 필드는 해당 변수에 기록됩니다. -
입력 파일의 중간 필드를 discard
파일 이름 바꾸기 작업의 일부가 아니기 때문에 명명된 변수(절대 사용되지 않음) 에 저장 합니다 .
테스트 버전을 실행하려면 줄을 mv
다음으로 시작 하면 명령이 echo
인쇄됩니다 .mv
답변3
mv
awk 자체에서 실행할 수 있습니다 .
awk -F" - " '{ system("mv "$1" "$2) }' filename.txt
awk를 사용하지 않고도 이를 수행할 수 있습니다.
while read N1 SEP N2; do mv ${N1} ${N2}; done < filename.txt