내 폴더에 많은 파일이 있습니다.
$ 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' {} \;