Awk는 변수를 사용하여 특정 조건에 해당하는 문자열을 대체합니다.

Awk는 변수를 사용하여 특정 조건에 해당하는 문자열을 대체합니다.

특정 조건이 true인 동일한 줄의 문자열을 대체하기 위해 awk 변수를 사용하려고 합니다.

나에게 많은 도움이 될 수 있는 것을 찾았지만, 이를 위해서는 변수를 사용해야 하기 때문에 새로운 난관에 직면하게 되었습니다.

다음은 내 콘텐츠 파일의 예입니다.

0;20220808163547;
1224;20220808163547;
1224;20220808170514;
0;20220808170514;

두 번째 열이 값과 일치하면 항상 첫 번째 열을 바꿔야 합니다 20220808170514.

다른 게시물 덕분에 완료할 수 있었습니다. https://stackoverflow.com/questions/20664446/bash-replace-string-where-special-condition-is-true

이것은 훌륭하게 작동합니다.

awk '/20220808170514/ {sub(/0/,"2048")}1' FileName.ctrl

하지만 이 작업을 역동적인 방식으로 수행해야 합니다.

v1=2048
v2=20220808170514
awk -v var1="$v1" -v var2="$v2" '/var2/ {sub(/0;/,var1";")}1' FileName.ctrl

그러나 그것은 작동하지 않았습니다.

0;20220808163547;
0;20220808163547;
0;20220808170514;
0;20220808170514;

이런 게 필요해

0;20220808163547;
1224;20220808163547;
2048;20220808170514;
2048;20220808170514;

추신: v1과 v2의 출시 시기는 다릅니다.

답변1

나는 다음과 같은 것을 제안하고 싶습니다 :

$ awk -v FS=';' -v OFS=';' -v var1="$v1" -v var2="$v2" '$2 == var2 { $1 = var1 } 1' filename 
0;20220808163547;
1224;20220808163547;
2048;20220808170514;
2048;20220808170514;

먼저, 행을 변수의 패턴과 일치시키는 방법은 입니다 $0 ~ var. 그냥 /var/문자 그대로의 정규 표현식으로 취급하세요. 그런 다음 sub(/0;/, ...)이면 첫 번째 필드만 대체되고 0아무것도 대체되지 않습니다 1224.

그러나 필드 구분 기호를 올바르게 설정하면 $2두 번째 필드( )가 변수와 동일한 값을 갖는 한 첫 번째 필드( )를 바꿀 수 있습니다 $1. 입력 및 출력 필드 구분 기호( FS및 )를 파일에 사용된 구분 기호 OFS로 설정 해야 합니다.;

관련 정보