두 개의 열이 있는 파일을 읽고 이를 사용하여 파일 이름을 변경합니다.

두 개의 열이 있는 파일을 읽고 이를 사용하여 파일 이름을 변경합니다.

두 개의 열이 있는 텍스트 파일이 있습니다. 한 열은 현재 파일 이름을 나타내고 다른 열은 파일의 최종 이름으로 원하는 이름을 나타냅니다. 텍스트 파일은 다음과 같습니다.

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

mvawk 자체에서 실행할 수 있습니다 .

awk -F" - " '{ system("mv "$1" "$2) }' filename.txt

awk를 사용하지 않고도 이를 수행할 수 있습니다.

while read N1 SEP N2; do mv ${N1} ${N2}; done < filename.txt

관련 정보