파일에서 줄 삭제

파일에서 줄 삭제

내 폴더에 많은 파일이 있습니다.

$ ls -hlS | head
total 75M
-rw-r--r-- 1 ubuntu ubuntu 511 Aug  3 16:27 NW_009517088.1.lst
-rw-r--r-- 1 ubuntu ubuntu 478 Aug  3 16:27 NW_009539008.1.lst
-rw-r--r-- 1 ubuntu ubuntu 471 Aug  3 16:27 NW_009386266.1.lst
-rw-r--r-- 1 ubuntu ubuntu 471 Aug  3 16:27 NW_009411177.1.lst
-rw-r--r-- 1 ubuntu ubuntu 451 Aug  3 16:27 NW_009514912.1.lst

각 파일의 내용은 *.lst다음과 같습니다.

$ cat NW_009514912.1.lst
rna-NisyCt036+
cds-YP_358756.1-
rna-NisyCt037+
cds-YP_358757.1+
cds-YP_358758.1+
cds-YP_358758.1+
id-NisyCp117-1+
id-NisyCp117-2+
id-LOC104209938-1-
rna-XM_009770987.1-
rna-XM_009780247.1+
rna-XM_009783083.1+
rna-XM_009784022.1-
rna-TRNAN-GUU+

*.lst로 시작하지 않는 각 파일의 줄을 제거하는 방법은 무엇입니까 rna-XM_?

답변1

삭제하고 싶다고 가정 해 보겠습니다.모두(=로 시작 하지 않는 rna-XM_줄만 유지하다) 부터 rna-XM_다음을 시도해 볼 수 있습니다.

for file in *.lst; do awk '/^rna-XM_/' "$file" > "${file}.new"; done

이것은 이름이 다음으로 끝나는 모든 파일을 반복 .lst하고 출력이 파일에 기록되는 위치로 시작하는 줄만 인쇄합니다 ( rna-XM_원본 파일 내용을 바꾸려면 filename.lst.new이름을 바꿔야 할 수도 있습니다 ).filename.lst

동일하게 적용됩니다 sed(@Rakesh Sharma의 의견 참조).

for file in *.lst; do sed '/^rna-XM_/!d' "$file" > "${file}.new"; done

코드가 정확하다고 확신하는 경우 sed의 "인라인" 편집 기능을 사용하여 상태를 확인할 수 있습니다.

for file in *.lst; do sed -i '/^rna-XM_/!d' "$file"; done

filename.lst.new이렇게 하면 파일이 수정되므로 이름을 다음 으로 바꿀 필요가 없습니다.filename.lst

"shell for--loop" 방법은 다음보다 작습니다.출력 구문 분석find(일부 의견에서 제안) 파일 이름에 특수 문자가 포함될 수 있는 경우. GNU 구현에는 이러한 상황을 처리할 수 있는 옵션이 find있지만 xargs이식성 이 없습니다.-print0-0

답변2

아래 find 명령을 사용하여 현재 디렉터리의 파일 확장자 *.lst를 확인하고 파일에서 "rna"로 시작하지 않는 모든 줄을 삭제할 수 있습니다.

find . -maxdepth 1 -type f -name "*.lst" -exec sed -i '/^rna/!d' {} \;

관련 정보