ファイルから行を削除

ファイルから行を削除

私のフォルダにはたくさんのファイルがあります。

$ 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

おすすめ記事