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
올바른 아이디어 - 잘못된 구현
이 필드를 저장해야 합니다.가치필드별로 색인화된 배열에서위치. 따라서 대신
a[$i]
에a[i]=$i
그런 다음 값을 찾아야합니다색인별배열에서. 그러니까 그렇지
$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
~처럼에드 모튼이 지적했다.split
, 명시적 루프를 awk 내장 함수로 대체하여 솔루션을 개선 할 수 있습니다 .
awk -F'|' 'BEGIN{OFS=FS} NR==1 {split($0,a)} NR>1 {for(i in a) if( $i == "." ) $i=a[i]}1'