5,000개의 저널 기사 인용 텍스트 파일이 있습니다. 추상적인 부분만 추출하려고 합니다. 이는 동일한 텍스트 문서를 유지하고 요약을 제외한 다른 모든 텍스트를 제거하고 싶다는 의미입니다. 저는 Linux를 처음 접했고 한동안 여러분의 보드를 가지고 놀았습니다.
for file in test
nano my.sh
while read variable do
sed '0,/^Abstract$/d'
done <file
다음은 과학 저널 기사와 유사한 파일의 예입니다.
Sponsor : Beckman Res Inst Cty Hope
1500 E. Duarte Road
Duarte, CA 910103000 / -
NSF Program : 1114 CELL BIOLOGY
Fld Applictn: 0000099 Other Applications NEC
61 Life Science Biological
Program Ref : 9285,
Abstract :
Studies of chickens have provided serological and nucleic acid
probes useful in defining the major histocompatibility complex
(MHC) in other avian species. Methods used in detecting genetic
diversity at loci within the MHC of chickens and mammals will be
applied to determining the extent of MHC polymorphism within
small populations of ring-necked pheasants, wild turkeys, cranes,
Andean condors and other species. The knowledge and expertise
gained from working with the MHC of the chicken should make for
rapid progress in defining the polymorphism of the MHC in these
species and in detecting the polymorphism of MHC gene pool within
small wild and captive populations of these birds.
답변1
내가 이해한 바로는 일련의 파일을 그 자리에서 변경하고 싶다는 것입니다. 첫 번째 줄을 포함하여 모든 것을 삭제하고 싶습니다총의 Abstract
. 파일이 현재 디렉토리에 있고 모두 .txt
확장자로 이름이 지정된 경우 다음을 사용하십시오.
sed -i '0,/^Abstract$/d' *.txt
오래된 파일을 덮어쓰게 되고, 문제가 발생할 경우를 대비해 백업 없이 사용하지 마세요.
이를 위해서는 GNU sed
(Linux의 표준)가 필요할 수 있습니다.
어떻게 작동하나요?
-i
이
-i
옵션은sed
파일이 그 자리에서 편집되도록 지시합니다. 오래된 파일을 덮어쓰게 됩니다.0,/^Abstract$/d
이 명령은 첫 번째 줄(숫자 0)부터 정규식과 일치하는 첫 번째 줄까지의 모든 줄을
sed
삭제( )하도록 지시합니다 . 캐럿 은 줄의 시작 부분과 일치하고 달러 기호는 줄의 끝 부분과 일치합니다. 따라서 이 정규식은 다음을 포함하는 행과 일치합니다.d
^Abstract$
^
오직이 단어는Abstract
다음과 관련이 있습니다.아니요라인의 다른 캐릭터.*.txt
이는 현재 디렉토리에서 접미사가 있는 모든 파일을 선택하도록 쉘에 지시합니다
.txt
.
고쳐 쓰다
첫 번째 줄까지 각 파일의 모든 줄이 삭제됩니다.에 의해. . 시작 Abstract
:
sed -i '0,/^Abstract/d' *.txt
제거 되었으므로 $
이 정규식에서는 줄이 Abstract
.
답변2
사용 sed
:
sed -ni.bak '/^Abstract/,$p' *.txt
^
파일의 처음부터 끝까지 모든 줄을 가져오고 Abstract
sed 옵션을 사용하여 이름이 지정된 원본 파일의 복사본을 저장합니다.,
$
*.txt.bak
-i
그리고 awk
:
awk '/^Abstract/,0' *.txt
sub_directory에도 동일한 내용을 적용하려면 find
다음 명령을 사용하세요.
find /path/to/main-dir -type f -name "*.txt" -exec sed -ni.bak '/^Abstract/,$p' '{}';
파일 이름에 새 줄이 있으면 더 잘 작동합니다.
find /path/to/main-dir -type f -name "*.txt" -print0 | while IFS= read -d '' -r file
do
sed -ni.bak '/^Abstract/,$p' "$file";
done
질문 본문( )에 제공된 솔루션에서는 이름이 (디렉토리 검색을 위해) 로 끝나는 find -name *txt -type d -exec sed -i '0,/^Abstract/d' *.txt {} \;
디렉터리를 검색합니다 . 동일한 이름을 가진 디렉터리가 없으면 해당 부분이 실행되지 않습니다. 따라서 명령으로 아무 작업도 수행하지 않습니다.-type d
txt
*txt
-exec
따라서 파일 이름에 공백이 있으면 (모든 *.txt 파일을 의미함) 변경 *txt -type d
하고 "*.txt" -type f
인용해야 합니다. 또한 find 명령에서는 발견된 현재 파일을 가리키고 참조하므로 명령 끝에서 제거 -type f
해야 합니다 . 명령어에서 찾을 경로를 지정해 주시면 더 좋을 것 같습니다. 마지막으로 시도한 명령은 다음과 같습니다.*.txt
sed
'{}'
find /path/to/main-dir -name "*.txt" -type f -exec sed -i '0,/^Abstract/d' '{}' \;