디렉토리의 모든 .txt 파일에서 부분 줄을 얻는 방법은 무엇입니까?

디렉토리의 모든 .txt 파일에서 부분 줄을 얻는 방법은 무엇입니까?

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

^파일의 처음부터 끝까지 모든 줄을 가져오고 Abstractsed 옵션을 사용하여 이름이 지정된 원본 파일의 복사본을 저장합니다.,$*.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 dtxt*txt-exec

따라서 파일 이름에 공백이 있으면 (모든 *.txt 파일을 의미함) 변경 *txt -type d하고 "*.txt" -type f인용해야 합니다. 또한 find 명령에서는 발견된 현재 파일을 가리키고 참조하므로 명령 끝에서 제거 -type f해야 합니다 . 명령어에서 찾을 경로를 지정해 주시면 더 좋을 것 같습니다. 마지막으로 시도한 명령은 다음과 같습니다.*.txtsed'{}'

find /path/to/main-dir -name "*.txt" -type f -exec sed -i '0,/^Abstract/d' '{}' \;

관련 정보