2016-05-15 38 views
0

私は300個のファイルを含むフォルダを持っています。 $ 2 < = 25の場合、ファイルから行を削除したいと思います。どのようにしてファイルから直接行を削除することができますか(場所編集中)?私のコードは以下の通りです。条件に基づいて行全体を削除する

awk '{ for (i=1; i<=NF; i++) { if ($2 <= 25) next } print }' < * 

ads 54.5 18 15.3 39.2 
bdy 18.5 21 1.5  17.0 
cst 36.8 22 27.7 9.1 
hst 40.2 25 16.2 24.0 
ads 18.9 41 5.0  13.2 
bdy 20.5 45 67.0 19.0 
+0

参照:[列1に特定の数値が入力されている行をすべて削除](http://stackoverflow.com/questions/22697636/delete-all-lines-where-column-1-has-specific-numeric-entries) [awk save inplace](http://stackoverflow.com/questions/16529716/awk-save-modifications-inplace) – Cyrus

+1

しようとする前にArnold RobbinsのEffective Awk programming、第4版を読むことを強くお勧めしますawkの構文(たとえば$ 2をテストするすべてのフィールドをループするたびに繰り返す)や呼び出し(例:ファイルリストからの入力リダイレクトを使用しようとしていて、awkが知らないファイルの値を何とか変更しようとしているのは、そのリダイレクトの礼儀です)。 –

答えて

2

スクリプトが多すぎます。私の心のきれいな解決策は、条件を反転:

awk '{ if ($2 > 25) print }' 

かさえ:

awk '$2 > 25' 

あなたは、その後、状態を反転させたくない場合は、次の

awk '{ if ($2 <= 25) next; print }' 

ありますすべてのフィールドを反復処理する必要はありません。ファイルの変更 'その場で'


さえGNU awkサポート。結果を一時ファイルに書き込んだ後、一時的に元のファイルにコピーまたは移動する必要があります。 (コピーはハードリンクと権限を保持し、休憩のリンクを移動し、所有者とパーミッションを変更することができますあなたはそれが心配だかどうかを決定する必要があります。)GNU Awkの4.xの機構を持っていることを指摘しEd Morton

感謝を彼はそれを追加しようとしたので、部分的にはその場でファイルを編集する。

GNU Awk 4.xがファイルのインプレース修正をサポートしているとは言いませんが、マニュアルの正しい部分が見つかった場合(Extension sample: inplace - 私の見解から誤ってタイトルが付けられています;単なるサンプルではありません)、GNU Awkがコマンドラインで指定された通常のファイルを上書きする拡張機能があることがわかります。

gawk -i inplace '{ if ($2 > 25) print }' file1 … 

かさえ:実験は、その場で読み取り専用のファイルを変更することは非常に幸せであることを示していることを

gawk -i inplace '$2 > 25' file1 … 

注意。これはsed(GNUとBSD(Mac OS X)の両方の亜種)と一致しています。彼らはまた、警告なしでその場で読み取り専用ファイルを変更し、ファイルに対するパーミッションを保持しますが、ハードリンクを解除します。


あなたのスクリプトがawk '…' < *を使用しています。これは、ディレクトリ内の唯一のファイルでない限り、ディレクトリ内の最初のファイルを無視する特殊な方法です(標準入力に使用されますが、ディレクトリに複数のファイルがある場合、標準入力は無視されます)。 < *ではなく、ちょうど*を使用する必要があります。

関連する問題