たとえば、N個のファイル(file1、file2、file3...)があります。
そのうち最初の20%が必要で、結果ディレクトリは(file1_20、file2_20、file3_20 ...)と同じでなければなりません。
wc
これを使用してファイルの行数を取得し、0.2を掛けたいと思います。
その後、get 20%を使用してhead
新しいファイルにリダイレクトしますが、自動化する方法がわかりません。
ベストアンサー1
したがって、動作する例を作成します。
root@crunchbang-ibm3:~# echo {0..100} > file1
root@crunchbang-ibm3:~# cat file1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
次のコマンドを使用してファイルサイズをバイト単位で取得できますstat
。
root@crunchbang-ibm3:~# stat --printf %s "file1"
294
次に、次を使用してbc
サイズに0.2を掛けることができます。
root@crunchbang-ibm3:~# echo "294*.2" | bc
58.8
しかし、浮動小数点を得たので、これを整数に変換してみましょうhead
(dd
この方法も機能します)。
root@crunchbang-ibm3:~# printf %.0f "58.8"
59
最後に、file1の最初の20%(バイトの提供またはインポート):
root@crunchbang-ibm3:~# head -c "59" "file1"
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
それらを合わせると、次のことができます。
mkdir -p a_new_directory
for f in file*; do
file_size=$(stat --printf %s "$f")
percent_size_as_float=$(echo "$file_size*.2" | bc)
float_to_int=$(printf %.0f "$percent_size_as_float")
grab_twenty=$(head -c "$float_to_int" "$f")
new_fn=$(printf "%s_20" "$f") # new name file1_20
printf "$grab_twenty" > a_new_directory/$new_fn
done
f
forループが実行されているディレクトリで見つかったエントリのプレースホルダはどこにありますか?file*
終了後:
root@crunchbang-ibm3:~# cat a_new_directory/file1_20
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
更新(行の20%を取得):
行の最初の20%を取得するには、次のようstat --printf %s "$f"
に置き換えることができます。
wc -l < "$f"
を使用しているので、printf
効果的にbc
from を丸めることができますが、.5
ファイルの長さが 1~2 行に過ぎないと欠けています。したがって、丸める必要があるだけでなく、基本的に少なくとも1つの行を取得する必要があります。