두 개의 파일이 있습니다. 하나는 (필요하지 않은) 줄 목록이 있고 Seqlist
다른 텍스트 파일 (해당 줄을 삭제하려고 함)은 다음과 같이 말합니다.ContentFile
$cat Seqlist
3
4
7
10
345
7000
67001
.....
나는 다음을 사용했다:
$ while read A; do sed -e "$((A)d" ContentFile; done < Seqlist >OUTPUT
그런데 세 번째 줄 번호만 지웠어요. 나머지 행은 삭제되지 않습니다.
답변1
d
줄 번호 파일의 각 번호 끝에 를 추가하면 sed
입력에서 지정된 줄을 제거하는 스크립트로 변환됩니다. 그렇다면 매우 간단합니다.
$ sed -f lines_to_delete.sed file_with_lines.txt
스크립트 sed
는 다음과 같이 생성될 수 있습니다:
$ sed -e 's/$/d/' file_with_numbers.txt >lines_to_delete.sed
답변2
사용 ed
:
printf "%s\n" $(printf "%sd\n" $(sort -rnu Seqlist)) w | ed ContentFile
이는 편집을 printf
위해 명령 목록(Seqlist의 고유한 역 정렬 행 번호 목록에서 행 제거 명령, 수정된 파일을 디스크에 다시 쓰는 "w")을 작성하는 데 사용됩니다.ed
ContentFile
답변3
줄 번호 목록이 메모리에 맞는 경우(그러나 반드시 콘텐츠 파일일 필요는 없음 ed
) 다음을 수행할 수 있습니다.
awk 'FNR==NR{n[$0];next} !(FNR in n)' Seqfile ContentFile
두 파일이 모두 크거나 클 수 있고 Seqfile이 정렬된 경우
cat -n ContentFile | join -v2 -j1 Seqfile - | sed 's/^[0-9]* //'
답변4
문제는 스크립트가 처음에 sed를 통해 전체 파일을 실행하므로 다른 숫자는 작동하지 않는다는 것입니다.
가장 간단한 해결책은 행 목록을 작성하고 sed를 통해 한 번 실행하는 것입니다.
s=
while read a
do s="$s$a d;"
done < Seqlist
sed -e "$s" ContentFile >OUTPUT