ディレクトリ内のすべての.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' '{}' \;

関連情報