저는 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