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