更新(行の20%を取得):

更新(行の20%を取得):

たとえば、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

しかし、浮動小数点を得たので、これを整数に変換してみましょうheadddこの方法も機能します)。

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

fforループが実行されているディレクトリで見つかったエントリのプレースホルダはどこにありますか?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効果的にbcfrom を丸めることができますが、.5ファイルの長さが 1~2 行に過ぎないと欠けています。したがって、丸める必要があるだけでなく、基本的に少なくとも1つの行を取得する必要があります。

おすすめ記事