특정 조건이 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
로 설정 해야 합니다.;