ファイル名は(百ファイル)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' {} \;
仕組み:
-i.bak
sed にファイルを変更し、拡張子 .bak を持つバックアップファイルを作成するように指示します。-n
明示的に要求されない限り、行を印刷しないようにsedに指示します。11,$p
$
sedに行11で始まり、ファイルの最後の行で終わる行を印刷するように指示します(で示されています)。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
i
00
ksh93
zsh
答え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