특정 라인 번호를 가진 파일에 지정된 라인을 삭제합니다.

특정 라인 번호를 가진 파일에 지정된 라인을 삭제합니다.

A텍스트 파일에서 제거하려는 줄 번호가 포함된 텍스트 파일이 있습니다 B. 예를 들어, 파일에는 A.txt다음 줄이 포함되어 있습니다.

1
4
5

파일 B.txt에 다음 줄이 포함되어 있습니다.

A
B
C
D
E

생성된 파일은 다음과 같아야 합니다.

B
C

물론 수동으로 할 수도 있지만

sed '1d;4d;5d' B.txt

하지만 줄 번호를 수동으로 지정하지 않고 이 작업을 수행하는 방법을 알고 싶습니다.

답변1

awk다음을 사용할 수도 있습니다 .

awk 'NR==FNR { nums[$0]; next } !(FNR in nums)' linenum infile

특별한 경우에 "linenum" 파일이 비어 있을 수 있으면 awk는 이를 건너뛰므로 전체 "infile" 줄을 인쇄하지 않습니다. 이 문제를 해결하려면 다음 명령을 사용하세요.

awk 'NR==FNR && FILENAME==ARGV[1]{ nums[$0]; next } !(FNR in nums)' linenum infile

아니면 더 나은 (감사합니다스티븐 차제라스):

awk '!firstfile_proceed { nums[$0]; next } 
     !(FNR in nums)' linenum firstfile_proceed=1 infile

답변2

sed 프로그램을 작성하려면 sed를 사용하십시오.

sed "$(sed 's/$/d/' A.txt)" B.txt > C.txt

"프로그램"은 더욱 복잡해질 수 있습니다. 예를 들어 행이 숫자인지 확인하거나 주석 구문을 만들어 제거할 수 있습니다.

답변3

또 다른 접근 방식은 기본 셸 명령을 결합하는 것입니다.

join -v1 <(nl file) line_numbers | cut -d' ' -f2-

또는:

nl file | join -v1 - line_numbers | cut -d' ' -f2-

nl파일의 줄 번호를 매긴 다음 join -v1두 번째 파일에서 일치하지 않는 줄만 유지하고 마지막으로 cut줄 번호를 유지하는 데 사용됩니다. 파일을 line_numbers정렬해야 합니다.

답변4

for i in `cat fileA`; do  sed -n ''$i'p' fileB; done >>content.txt
for i in `cat content.txt`; do sed -i '/^'$i'$/d' fileB;done

output
B
C

관련 정보