最初のフィールド値が400より大きい場合は、各テキストファイルの行を削除します。

最初のフィールド値が400より大きい場合は、各テキストファイルの行を削除します。

txtファイルが多すぎます。各 txt ファイルの形式は次のようになります。

200 0.2 0.1 0.5 0.4
500 0.4 0.9 0.9 0.1

最初のフィールド値が400を超える各txtファイルのすべての行を削除しようとしています。したがって、上記のファイルには次の内容のみを含める必要があります。

200 0.2 0.1 0.5 0.4

パスワード

for file in *.txt; do 
        echo "$(awk '{ if ($1 < 401) print }' *.txt)" > tmp && mv tmp *.txt 
done 
rm -f tmp 

ただし、これはすべてのファイルを次のテキストファイルに移動するため、機能しません。

答え1

GNU awk(Linuxを使用している場合はほぼ確実です)を使用している場合は、GNU awkの内部編集ライブラリを使用できます。forこれを行うためにシェルループや一時ファイルも必要ありません。

 awk -i inplace '$1 < 401' ./*.txt

これにより、各テキストファイルからフィールド1> 400のすべての行が削除されます。まず、GNU awkinplaceライブラリをロードしてから$1 < 401trueと評価された行のみを出力するように動作します。

awkが各ソースファイル(.bakファイル拡張子など)を変更する前にバックアップするようにするには、awkのINPLACE_SUFFIX変数を使用できます。

 awk -i inplace -v INPLACE_SUFFIX=.bak '$1 < 401' ./*.txt

注:内部編集オプション(およびsedperlを含む他のプログラムとは異なり、GNU awkのオプションは、次の引数で指定されたgawkライブラリを含む...ieの略です。このライブラリ(「inplace」と呼ばれる)は内部編集機能を提供します。-i-i--include

答え2

fileループ内で引用する必要があり、以下を使用する必要はありませんecho

for file in *.txt; do 
        awk '{ if ($1 < 401) print }' < "$file" > tmp && mv -- tmp "$file"
done 
rm -f tmp

AWKコードは次のように単純化することもできます。

for file in *.txt; do 
        awk '$1 < 401' < "$file" > tmp && mv -- tmp "$file"
done 
rm -f tmp

要件を完全に満たすためにテストを変更する必要があります。

for file in *.txt; do 
        awk '!($1 > 400)' < "$file" > tmp && mv -- tmp "$file"
done 
rm -f tmp

答え3

タスクを実行するには、次のようにコードを変更できます。

for file in *.txt; do 
        awk '{ if ($1 < 401) print }' < "$file" > tmp && mv -- tmp "$file" 
done 
rm -f tmp 

ただし、元のファイルを上書きするときは注意してください。変更したファイルを別のディレクトリ(類似ディレクトリ)に作成することをお勧めします。mv tmp modified/$fileファイルをコピーする前にディレクトリを作成することを忘れないでください。

ロジックを「400より大きい」と定義する場合は、次のようにする必要がありifます$1 <= 400(数字は400.1になることがあります)。

関連情報