다른 파일에 패턴이 있는 경우 awk를 사용하여 한 파일의 문자열을 바꾸는 방법

다른 파일에 패턴이 있는 경우 awk를 사용하여 한 파일의 문자열을 바꾸는 방법

데이터 파일이 있습니다 A.txt(필드 구분 기호 = \t).

Well    Well Type   Well Name   Dye Target  
A1      Unknown     HIGH-001    FAM ViroFAM                 
A1      Unknown     HIGH-001    HEX ViroHEX

그리고 템플릿 파일 B.txt:

kit
Software Version = NOVA_v1
Date And Time of Export = 07/02/2020 13:44:11 UTC
Experiment Name =
Instrument Software Version =
Instrument Type = CFX
Instrument Serial Number =
Run Start Date =
Run End Date =
Run Operator =
Batch Status = VALID
Method = Novaprime
Date And Time of Export,Batch ID,Sample Name,Well,Sample Type,Status,Interpretive Result,Action*,Curve analysis
,taq,205920777.1,A01,Unkn-01
,taq,neg5,A02,Unkn-09
,,,,,,,,,,
*reporting.

=두 번째 행의 값 으로 교체를 인쇄하고 싶지만 패턴이 다섯 번째 열에 있는 경우에만 가능합니다.B.txtVIRO_v1ViroHEXA.txt

이를 위해 저는 다음과 같은 작업을 시작했습니다.

awk -F'\t' '
  FNR==NR{ a[NR]=$2; next }
  $1=="Software Version"{ print $0,"VIRO_v1"; next }
  1
' B.txt FS=" =" B.txt > result.txt

그러나 나는 그 부분을 파악하지 못했습니다 A.txt. 무엇을 해야할지 아시나요?

답변1

awk -F'\t' '
  NR==FNR{ if ($5=="ViroHEX"){ viro=1 } next }
  viro && $1=="Software Version"{ $2="VIRO_v1" }
  1
' A.txt FS=" = " OFS=" = " B.txt > result.txt

첫 번째 필드가 첫 번째 파일의 5열과 동일하고 아무 곳에나 나타나는 경우 두 번째 파일의 두 번째 필드( )가 NOVA_v1대체 됩니다.VIRO_v1Software VersionViroHEX

두 번째 파일의 필드 구분 기호는 <space>=<space>(탭 아님)이라고 가정합니다.

답변2

~처럼Bernbaum의 솔루션하지만 실제로 일치하고 삽입하는 내용에 대해서는 더 주의하세요.

awk -F '\t' '$5 == "ViroHEX" { found = 1; exit } END { exit !found }' A.txt &&
sed '2 s/=.*/= VIRO_v1/' B.txt

이는 먼저 파일에서 탭으로 구분된 다섯 번째 필드에 awk정확한 문자열이 나타나는지 확인하는 데 사용됩니다 . 필요한 것보다 더 많은 파일 내용을 읽지 않으며 나중에 조건부 실행에 사용되는 종료 상태로 종료됩니다 .ViroHEXA.txtsed

sed명령은 =두 번째 줄의 첫 번째 문자에 있는 모든 내용을 B.txtstring 으로 바꿉니다 = VIRO_v1.

A.txt파일에 다섯 번째 열이 포함되어 있지 않으면 출력 ViroHEX이 생성되지 않습니다.

다음 변형은 항상 B.txt파일을 생성하며, 가능하면 두 번째 줄에서 대체가 수행됩니다.

if awk -F '\t' '$5 == "ViroHEX" { found = 1; exit } END { exit !found }' A.txt
then
    sed '2 s/=.*/= VIRO_v1/'
else
    cat
fi <B.txt

2행을 수정하지 않고 대신 2행을 수정하려는 경우 Software Version = ...호출에 사용된 표현식을 sed다음으로 변경합니다.

s/^\(Software Version = \).*/\1 VIRO_v1/

답변3

내 겸손한 의견으로는 더 간단한 해결책입니다. 불행히도 awk 외에 다른 도구를 사용합니다.

awk '{print $5}' A.txt | grep -q VIROHEX && sed 2s/NOVA/VIRO/ B.txt

&& 앞 부분은 조건을 구현하고 프로그램은 sedB.txt 파일의 텍스트를 대체합니다.

편집: 내 솔루션이 게으르다는 점을 지적한 AdminBee에게 감사드립니다. 더 나은 것 :

awk '{print $5}' A.txt | grep -q VIROHEX && sed '2s/=.*/= VIRO_v1/' B.txt

관련 정보