私のフォルダにはたくさんのファイルがあります。
$ 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' {} \;