데이터 파일이 있습니다 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.txt
VIRO_v1
ViroHEX
A.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_v1
Software Version
ViroHEX
두 번째 파일의 필드 구분 기호는 <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
정확한 문자열이 나타나는지 확인하는 데 사용됩니다 . 필요한 것보다 더 많은 파일 내용을 읽지 않으며 나중에 조건부 실행에 사용되는 종료 상태로 종료됩니다 .ViroHEX
A.txt
sed
이 sed
명령은 =
두 번째 줄의 첫 번째 문자에 있는 모든 내용을 B.txt
string 으로 바꿉니다 = 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
&& 앞 부분은 조건을 구현하고 프로그램은 sed
B.txt 파일의 텍스트를 대체합니다.
편집: 내 솔루션이 게으르다는 점을 지적한 AdminBee에게 감사드립니다. 더 나은 것 :
awk '{print $5}' A.txt | grep -q VIROHEX && sed '2s/=.*/= VIRO_v1/' B.txt