Linux의 파일에서 특정 줄 번호 제거(변수로 전달됨)

Linux의 파일에서 특정 줄 번호 제거(변수로 전달됨)

두 개의 파일이 있습니다. 하나는 (필요하지 않은) 줄 목록이 있고 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")을 작성하는 데 사용됩니다.edContentFile

답변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

관련 정보