동일한 경우 "인접 필드 텍스트" 또는 "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