テキストファイルから特定の行の固定部分を削除する方法は?

テキストファイルから特定の行の固定部分を削除する方法は?

ls -Rlh /path/to/directory > file私はいくつかのハードドライブの内容を記録するためにいくつかのテキストファイルを使用してきました。

テキストファイルを作成した後、いくつかの文字列を削除したいと思います。

テキストファイルのいくつかの例は次のとおりです。

external1:
total 36K
drwxrwxr-x 2 emma emma 4.0K Oct 31 01:29 dir1
drwxrwxr-x 2 emma emma  12K Oct 31 01:29 dir2
drwxrwxr-x 2 emma emma  20K Oct 31 01:29 dir3

external1/dir1:
total 4.5M
-rw-rw-r-- 1 emma emma 769K Oct 31 01:12 a001.jpg
-rw-rw-r-- 1 emma emma 698K Oct 31 01:12 a002.jpg
-rw-rw-r-- 1 emma emma 755K Oct 31 01:12 a003.jpg
-rw-rw-r-- 1 emma emma 656K Oct 31 01:12 a004.jpg
-rw-rw-r-- 1 emma emma 756K Oct 31 01:12 a005.jpg
-rw-rw-r-- 1 emma emma 498K Oct 31 01:12 a006.jpg
-rw-rw-r-- 1 emma emma 455K Oct 31 01:12 a007.jpg

external1/dir2:
total 8.7M
-rw-rw-r-- 1 emma emma  952K Oct 31 01:13 a001.jpg
-rw-rw-r-- 1 emma emma  891K Oct 31 01:13 a002.jpg
-rw-rw-r-- 1 emma emma  838K Oct 31 01:13 a003.jpg
-rw-rw-r-- 1 emma emma  846K Oct 31 01:13 a004.jpg
-rw-rw-r-- 1 emma emma  876K Oct 31 01:13 a005.jpg
-rw-rw-r-- 1 emma emma  834K Oct 31 01:13 a006.jpg
-rw-rw-r-- 1 emma emma  946K Oct 31 01:13 a007.jpg
-rw-rw-r-- 1 emma emma  709K Oct 31 01:13 a008.jpg
-rw-rw-r-- 1 emma emma 1007K Oct 31 01:13 a009.jpg
-rw-rw-r-- 1 emma emma  940K Oct 31 01:13 a010.jpg

external1/dir3:
total 4.6M
-rw-rw-r-- 1 emma emma 408K Oct 31 01:15 a001.jpg
-rw-rw-r-- 1 emma emma 525K Oct 31 01:15 a002.jpg
-rw-rw-r-- 1 emma emma 383K Oct 31 01:15 a003.jpg
-rw-rw-r-- 1 emma emma 512K Oct 31 01:15 a004.jpg
-rw-rw-r-- 1 emma emma 531K Oct 31 01:15 a005.jpg
-rw-rw-r-- 1 emma emma 532K Oct 31 01:15 a006.jpg
-rw-rw-r-- 1 emma emma 400K Oct 31 01:15 a007.jpg
-rw-rw-r-- 1 emma emma 470K Oct 31 01:15 a008.jpg
-rw-rw-r-- 1 emma emma 407K Oct 31 01:15 a009.jpg
-rw-rw-r-- 1 emma emma 470K Oct 31 01:15 a010.jpg

実際のテキストファイルの長さは数千短く、サイズは数メガバイトです。

私がやりたいことは、すべての行がファイルサイズで始まるように、その行からファイルサイズより前のすべての項目を削除することです。例えば

512K Oct 31 01:15 a004.jpg
531K Oct 31 01:15 a005.jpg
532K Oct 31 01:15 a006.jpg
400K Oct 31 01:15 a007.jpg
470K Oct 31 01:15 a008.jpg

ただし、他のすべての行(ディレクトリ名とフルサイズを含む)をそのままにしたいので、またはをcolrm使用することはできませんcut

答え1

解析された出力lsは信頼できませんが、次のような特別な場合には機能します。

sed -e 's/^.*emma emma //' file

これにより、各行から「emma emma」までのすべての内容が削除されます。文字列が1行に表示されない場合は変更されません。

私が書いた正規表現は、emmaの後の最初のスペースだけを削除し、サイズフィールドが右揃えを維持するようにします(たとえば、「709K」と「1007K」はどちらも1行に同じ数の文字を使用します)。

これを望まない場合は、次を使用します。

sed -e 's/^.*emma emma  *//' file

これにより、次のフィールドが始まるまで、emmaの後のすべてのスペースが削除されます。

以下はどんな場合でも動作するsedバージョンですuser group

sed -e 's/^.\{10\} [0-9]\+ [^ ]\+ [^ ]\+ //' file

出力の正確な形式に依存しているので、ls最初のバージョンよりも技術的に悪いです。ただし、特定のファイルで動作する必要があります。

バラよりなぜ`ls`を解析しないのですか?ls 解析がなぜ悪いのかに関する情報です。


すべてのファイルが属していない場合は、emmaこのようなawkスクリプトを使用する必要があります。

awk 'NF>2 {print $5,$6,$7,$8,$9} ; NF<3 {print}' file

フィールドが2つ以上の行の場合は、フィールド5-9のみを印刷します。 <3つのフィールドを含む行の場合は、行全体を印刷します。残念ながら、サイズフィールドの正しい位置合わせが失われます。awk少し複雑なスクリプトを使用して変更できます。

awk 'NF>2 {printf "%5s %s %s %s %s\n", $5, $6, $7, $8, $9} ; NF<3 {print}' file 

この最終バージョンは jasonwryan の回答にある for ループを統合するので、単一のスペースを含むファイル名を処理できます (G-Man が述べたように、連続したスペースは除く)。

awk 'NF>2 {printf "%5s", $5; for(i=6;i<=NF;i++){printf " %s", $i}; printf "\n"} ; NF<3 {print}' file 

答え2

awkを使用してください:

awk '{if ($1 ~/^-|d/) {for(i=5;i<=NF;i++){printf "%s ", $i}; printf "\n"} else print $0}' file

最初のフィールド-がまたはで始まる場合は、d5番目のフィールドから最後のフィールドまで印刷し、それ以外の場合はレコード全体を印刷します。

答え3

-o100MBのデータについて話しているので、gnu lsと-gオプションを使用してユーザーとグループを印刷せずに次の形式を取得することをお勧めします。

-rw-rw-r-- 1 952K Oct 31 01:13 a001.jpg

この sed コマンドは、行の先頭から不要なデータを削除します。

sed 's/^[-a-z]{10} \{1,\}[0-9]\{1,\}//'

不要なデータの一覧表示と削除を1段階にまとめることができます(この方法はこのページのほとんどのソリューションにも適用されます)、時間も節約できます。

ls -Rlhog /path/to/directory | sed 's/^[-a-z]\{10\} \{1,\}[0-9]\{1,\}//' > file

関連情報