첫 번째 줄을 참조로 사용하여 모든 행에서 특정 문자 일치를 바꿉니다.

첫 번째 줄을 참조로 사용하여 모든 행에서 특정 문자 일치를 바꿉니다.

H, 첫 번째 줄을 참조로 사용하여 모든 행의 특정 문자 일치(.)를 바꾸고 싶습니다.

답변을 다시 해싱하려고 시도했는데 다른 질문이 생겼습니다.

awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[$i] } NR>1 {for(i in a) if( $i == "\." ) $i="a"}1'

...위 코드에서 시도한 재작업 아이디어는 첫 번째 행 문자를 'a'에 저장한 다음 '.'을 볼 때 저장하는 것이었습니다. 행> 1에서 '.'을 변경합니다. 'a'에 저장된 해당 열 문자에. 하지만 작동하지 않았습니다.

입력:

A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
.|C|G|A|T|T|.|.|G|C|.|.|.|A|C|R|C|.|T|T
A|.|.|.|N|.|T|T|N|.|.|A|C|.|.|R|.|.|.|.

원하는 출력:

A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T

답변1

올바른 아이디어 - 잘못된 구현

  1. 필드를 저장해야 합니다가치필드에 의해 인덱스된 배열에서위치. 그래서 대신 a[$i]a[i]=$i

  2. 그런 다음 값을 찾아야합니다색인별배열에서. 그래서 $i="a"는 아니지만$i=a[i]

여담이지만 $i == "\."정규식 테스트가 아니므로 탈출할 필요는 없습니다..

$ awk -F'|' 'BEGIN{OFS=FS} NR==1 {for(i=1;i<=NF;i++) a[i]=$i } NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1' file
A|N|G|O|T|T|T|P|G|C|Q|A|R|A|S|G|U|V|T|T
A|C|G|A|T|T|T|P|G|C|Q|A|R|A|C|R|C|V|T|T
A|N|G|O|N|T|T|T|N|C|Q|A|C|A|S|R|U|V|T|T

처럼에드 모튼이 지적했다., awk 내장 split함수를 사용하여 명시적 루프를 대체하여 솔루션을 개선할 수 있습니다.

awk -F'|' 'BEGIN{OFS=FS} NR==1 {split($0,a)} NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1'

관련 정보