처리해야 할 파일이 너무 많지만 필요한 파일을 정확히 얻을 수 없습니다. 파일에서 이러한 일이 몇 번이나 발생할지 미리 알 수 없다는 점에 유의하세요(예: 파일당 1000번 이상 발생할 수 있음).
아래는 내 입력 파일(탭으로 구분)입니다. 여기서 $1은 줄 번호입니다. 손상된 일련의 숫자가 $3에 나타납니다.
797 47 M797 1 365.0 0.05 0.05 A 0.825
798 47 M798 1 365.0 0.05 0.05 A 0.825
799 47 M799 1 365.0 0.70 0.70 A 0.404
800 47 M800 1 365.0 0.00 0.00 A 0.990
801 47 M802 1 365.0 0.29 0.29 A 0.591
802 47 M803 1 365.0 0.12 0.12 A 0.726
이것이 내가 원하는거야:
797 47 M797 1 365.0 0.05 0.05 A 0.825
798 47 M798 1 365.0 0.05 0.05 A 0.825
799 47 M799 1 365.0 0.70 0.70 A 0.404
800 47 M800 1 365.0 0.00 0.00 A 0.990
801
802 47 M802 1 365.0 0.29 0.29 A 0.591
803 47 M803 1 365.0 0.12 0.12 A 0.726
지금까지 작성한 코드는 다음과 같습니다(파일 이름은 test.sh).
awk '
marker=substr($3,2,6)
{ if (FNR < marker) {printf "\n"}
}' ${1}
이것은 지금까지 얻은 결과입니다.
797 47 M797 1 365.0 0.05 0.05 A 0.825
798 47 M798 1 365.0 0.05 0.05 A 0.825
799 47 M799 1 365.0 0.70 0.70 A 0.404
800 47 M800 1 365.0 0.00 0.00 A 0.990
801 47 M802 1 365.0 0.29 0.29 A 0.591
802 47 M803 1 365.0 0.12 0.12 A 0.726
803 47 M804 1 365.0 0.08 0.08 A 0.777
이에 대한 더 나은 해결책이 있는 사람이 있으면 알려주시기 바랍니다.
답변1
awk
Python이 유용할 것이라는 희망 으로 태그를 지정했습니다 .
암호:
# !/usr/bin/python
import sys
def print_fixed_sequence(filename, line_num=0):
with open(filename, 'rU') as f:
for line in (x.strip() for x in f):
_, f1, f2, data = line.split('\t', 3)
rec_num = int(f2[1:])
while line_num != rec_num:
print(line_num)
line_num += 1
print('\t'.join((str(line_num), f1, f2, data)))
line_num += 1
print_fixed_sequence(sys.argv[1], line_num=795)
결과:
795
796
797 47 M797 1 365.0 0.05 0.05 A 0.825
798 47 M798 1 365.0 0.05 0.05 A 0.825
799 47 M799 1 365.0 0.70 0.70 A 0.404
800 47 M800 1 365.0 0.00 0.00 A 0.990
801
802 47 M802 1 365.0 0.29 0.29 A 0.591
803 47 M803 1 365.0 0.12 0.12 A 0.726
답변2
입력 파일
797 47 M797 1 365.0 0.05 0.05 A 0.825
798 47 M798 1 365.0 0.05 0.05 A 0.825
799 47 M799 1 365.0 0.70 0.70 A 0.404
800 47 M800 1 365.0 0.00 0.00 A 0.990
801 47 M802 1 365.0 0.29 0.29 A 0.591
802 47 M804 1 365.0 0.12 0.12 A 0.726
803 47 M807 1 365.0 0.12 0.12 A 0.726
804 47 M808 1 365.0 0.12 0.12 A 0.726
805 47 M812 1 365.0 0.12 0.12 A 0.726
806 47 M813 1 365.0 0.12 0.12 A 0.726
암호
#!/usr/bin/awk -f
BEGIN{ al=790 # added lines at start
ap=0 # appended lines (missing)
}
{
lc=$1 # line counter
$1=lc+ap # adjust line number
mr=substr($3,2,6) # marker
while( NR+al+ap < lc ){ print "added ++" ++al, ap,"lc=" lc}
while( NR+al+ap < mr ){ print $1; $1=lc+(++ap); }
if ( lc+ap == mr ){ print }
if ( lc+ap > mr ){ print "errorerror"; exit}
}
산출
added ++791 0 lc=797
added ++792 0 lc=797
added ++793 0 lc=797
added ++794 0 lc=797
added ++795 0 lc=797
added ++796 0 lc=797
797 47 M797 1 365.0 0.05 0.05 A 0.825
798 47 M798 1 365.0 0.05 0.05 A 0.825
799 47 M799 1 365.0 0.70 0.70 A 0.404
800 47 M800 1 365.0 0.00 0.00 A 0.990
801
802 47 M802 1 365.0 0.29 0.29 A 0.591
803
804 47 M804 1 365.0 0.12 0.12 A 0.726
805
806
807 47 M807 1 365.0 0.12 0.12 A 0.726
808 47 M808 1 365.0 0.12 0.12 A 0.726
809
810
811
812 47 M812 1 365.0 0.12 0.12 A 0.726
813 47 M813 1 365.0 0.12 0.12 A 0.726