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' '{}' \;