
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 < 401
trueと評価された行のみを出力するように動作します。
awkが各ソースファイル(.bakファイル拡張子など)を変更する前にバックアップするようにするには、awkのINPLACE_SUFFIX変数を使用できます。
awk -i inplace -v INPLACE_SUFFIX=.bak '$1 < 401' ./*.txt
注:内部編集オプション(およびsed
)perl
を含む他のプログラムとは異なり、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になることがあります)。