複数のファイルから最初の10行を削除する

複数のファイルから最初の10行を削除する

ファイル名は(百ファイル)file00で指定されますfile99。それらはすべて同じディレクトリにあります。 100個のファイルをすべてインポートして各ファイルの最初の10行を削除するにはどうすればよいですか? CentOS 7を使用しています。

答え1

file00これにより、次の範囲に名前が付いたすべてのファイルから最初の10行が削除されますfile99

sed -i.bak -n '11,$p' file[0-9][0-9]

これには、OSXでsed呼び出されるGNUが必要になる場合があります。gsed他のsedの場合は、以下を試してください。

find file[0-9][0-9] -maxdepth 0 -type f -exec sed -i.bak -n '11,$p' {} \;

仕組み:

  1. -i.baksed にファイルを変更し、拡張子 .bak を持つバックアップファイルを作成するように指示します。

  2. -n明示的に要求されない限り、行を印刷しないようにsedに指示します。

  3. 11,$p$sedに行11で始まり、ファイルの最後の行で終わる行を印刷するように指示します(で示されています)。

  4. file[0-9][0-9]file名前の後に2桁の数字が続くすべてのファイルと一致するように拡張されるシェルグローブ。

選ぶ

ロジックは反転できます。 11行目から明示的に印刷する代わりに(ヒント:JigglyNaga)最初の10行を削除できます。

sed -i.bak '1,10d' file[0-9][0-9]

答え2

bash(またはBourneに似たシェル)とGNUまたはBSDで簡単なループを使用するsed

for f in file[0-9][0-9]; do
  sed -i '.bak' '1,10d' "$f"
done

編集sedスクリプトは1,10d入力ストリームから1行から10行を削除します。他のラインが出力されます。ファイルではインライン編集が必要ですが、サフィックスを使用して元のファイルをバックアップする必要があり-i '.bak'ます。sed.bak

明示的なループを使用した代替(サブ間隔ksh93またはbash構文を許可するzsh):

for (( i = 0; i < 100; ++i )); do
  f="$( printf "file%02d" "$i" )"
  sed -i '.bak' '1,10d' "$f"
done

ksh93またはをzsh別の方法で使用する:

typeset -Z 2 j
for (( i = 0; i < 100; ++i )); do
  j=$i
  sed -i '.bak' '1,10d' "file$j"
done

0で埋められた幅2の数字にキャストされtypeset -Z 2 jます。 100に達すると、値が100になりループが無限ループに変わるため、この方法は$j望ましくありません。これは、書式設定に送信する前に明らかに値を使用しているため、処理できるように見えます。typeset i00ksh93zsh

答え3

一時ファイルを作成したり、ファイル権限、所有権、またはその他の属性に影響を与えたくない場合は、次のようにしますksh93

for f in file{2}([0-9]); do
  tail -n +11 < "$f" 1<>; "$f"
done

リダイレクト<>;演算子も同様に機能します<>(読み取り+書き込みモードで開きます)。ただし、コマンドが正常に終了すると、シェルはコマンドが中断されたファイルを切り捨てます。

したがって、基本的にファイル自体を上書きすることです。

答え4

Bashループを好む場合:

for f in file[0-9][0-9]; do
    tail -n +11 "$f" > tmp &&
    mv -f tmp "$f"
done

関連情報