조건을 사용하여 인접한 필드의 공백 채우기

조건을 사용하여 인접한 필드의 공백 채우기

동일한 경우 "인접 필드 텍스트" 또는 "X"로 공백을 행별로 채우고 싶습니다. 해결책을 제안해 주세요( AWK/ sed). (추가 요구 사항: 시공간 필드의 거리를 계산하는 것이 중요합니다. 헤더 레코드를 사용하는 경우에도 빈 필드의 거리는 < 100이어야 합니다.) 그렇지 않으면 인접한 필드가 일치하더라도 "X"가 채워집니다.

Example of blank fields filled with "X" even after matching: Line0 $612-$822. 

입력(탭으로 구분)

ID  577 592 598 600 612 650 700 822 825 830 840 870
Line0   A           A                   A           A
Line1   B           B                   NA          B
Line2   B           A                   A           A


비정상적인 빈 필드에 대한 설명

Exceptional intervals are Columns ID-600 to ID-822 because the distance is greater than 100

예상 출력

ID  577 592 598 600 612 650 700 822 825 830 840 870
Line0   A   A   A   A   X   X   X   X   A   A   A   A
Line1   B   B   B   B   X   X   X   X   NA  X   X   B
Line2   B   X   X   A   X   X   X   X   A   A   A   A


답변1

귀하의 요청을 올바르게 이해했는지 잘 모르겠지만, 어떻습니까?

awk -F"\t" '
NR > 1  {i = 2
         while (i<=NF)  {if (!$i)       {while (!$(++i)) ;
                                         for (j=LAST+1; j<i; j++) $j = ($LAST == $i)?$LAST:"X"
                                        }
                         LAST = i++
                        }
        }
1
' OFS="\t" file

ID      s577    s592    s598    s600    s612    s650    s700    s822    s825    s830    s840    s870
line0   A       A       A       A       A       A       A       A       A       A       A       A
line1   B       B       B       B       X       X       X       X       NA      X       X       B
line2   B       X       X       A       A       A       A       A       A       A       A       A

요청 시 주석이 달린 버전 제공:

awk -F"\t" '
NR > 1  {i = 2                                                  # Don't work on the header line
         while (i<=NF)  {if (!$i)       {while (!$(++i)) ;      # check every field if empty and
                                                                # increment i while seeing empty
                                                                # fields; i now holds next non-
                                                                # empty field 
                                         for (j=LAST+1; j<i; j++) $j = ($LAST == $i)?$LAST:"X"
                                                                # fill the empty fields with "X"
                                                                # or last non-empty field's value
                                                                # depending on actual and last
                                                                # fields' values being equal or not
                                        }
                         LAST = i++                             # retain last non-empty field
                        }
        }
1                                                               # default action: print
' OFS="\t" file

관련 정보