"Sed"를 사용하여 Bash에서 프라임 키 기능 수행

"Sed"를 사용하여 Bash에서 프라임 키 기능 수행

저는 bash를 사용하고 있으며 sed 명령을 사용하여 문자열을 일치시키고 두 파일 사이의 다른 문자열로 바꾸려고 합니다.

목적: [sp_* Var_Names]를 포함하는 다른 파일과 일치시켜 모든 문자열 [sp_*]을 대체합니다. 참고: 1. 두 파일의 순서는 동기화되지만 연속되지 않으므로 붙여넣기를 사용할 수 없습니다. 2. 이 기능은 mysql의 primeKey 연산과 유사합니다.


파일 1

+--sp_O00574_
|
+--sp_Q9TV16_
|
|     +--sp_O18983_
|  +--| (52)
|  |  |  +--sp_Q9BDS6_
|  |  +--| (26)
|  |     |  +--sp_O19024_
|  |     +--| (29)
|  |        +--sp_Q9XT45_

파일 2

O00574  CXCR6_HUMAN
Q9TV16  CXCR6_PANTR
O18983  CXCR6_CHLAE
Q9BDS6  CXCR6_MACFA
O19024  CXCR6_MACNE
Q9XT45  CXCR6_MACMU

목적:sed -ie 's/O00574/CXCR6_HUMAN/g' File1에

인라인 Bash 스크립트:

cat File2 | while read id; do upID=`echo $id | cut -d " " -f1`; upName=`echo $id | cut -d " " -f2`; sed -ie 's/sp_$upID/$upName/g' File1; done

script.sh

#/bin/bash

cat File2 | while read id;
do
    upID=`echo $id | cut -d " " -f1`
    upName=`echo $id | cut -d " " -f2`

    sed -ie 's/sp_$upID/$upName/g' File1
done

질문: sed 명령은 루프 내에서 작동하지 않습니다. File1에서는 전혀 변경 사항이 관찰되지 않았습니다. 스크립트에서 sed 명령을 에코한 다음 터미널에서 실행하면 예상대로 작동합니다. 문제가 무엇인지 알 수 없습니다.

귀하의 소중한 의견과 솔루션에 감사드립니다.

답변1

반복하는 대신 인덱스 파일(File2)에서 sed 스크립트를 생성하고 File1에 대해 스크립트를 실행합니다. 훨씬 빨라질 것입니다 :).

 awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > tranform.sed

그런 다음 다음을 수행하십시오.

 sed -i -f transform.sed File1.txt 

따라서 전체 스크립트는 다음과 같을 수 있습니다.

awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > transform.sed
sed -f transform.sed File1.txt

## if you want to remove your transformation file
rm transform.sed

관련 정보