ファイルのパーセンテージを取得

ファイルのパーセンテージを取得

ファイルの最後のx%を返すLinuxコマンドはありますか? tailが行数(-n)またはバイト数(-c)を返すことができることを知っていますが、ファイルの最後の25%を取得するにはどうすればよいですか?これを行うコマンドはありますか?

答え1

GNU分割は、テキストファイルで必要に応じてほぼ行われます。これにより、in.txt行を分割せずにバイト単位で最後の分岐(4/4部分)が印刷されます。

split -n l/4/4 in.txt

関連文書は次のとおりですsplit -n CHUNKS

CHUNKS次のようになります。[...] l/K/NNのK番目を標準出力に出力します。区切り線は必要ありません。

質問の例として言及されている非常に具体的な場合は、 4/4入力ファイルの第4四半期または最後の25%を要求してください。入力の1/n以外のサイズの場合、分割はそれほど単純な解決策を提供するとは思いません。

答え2

複雑bash+stat+bc+tailランダムレートソリューション:

get_last_chunk () { 
    local p=$(bc <<<"scale=2; $1/100")
    tail -c $(printf "%.0f" $(echo "$(stat -c%s $2) * $p" | bc)) "$2"
}

  • $1および$2- は、それぞれ関数の最初と2番目のパラメータです。
  • p- 浮動小数点数にパーセント値が割り当てられた変数(例:0.14または0.55
  • stat -c%s $2- 入力ファイルの実際のサイズをバイト単位で取得します。
  • tail -c N $2N- ファイルの最後のバイトを取得します。

または、より単純化されたバージョンを使用してください。

get_last_chunk () { 
    tail -c "$(($(stat -c%s - < "$2") * $1 / 100))" < "$2"))"
}

兆候:get_last_chunk <percent> <filename>

サンプルfile.txt:

apples
oranges
bananas
cherries

テストケース:

get_last_chunk 17 file.txt
ries 

get_last_chunk 77 file.txt
oranges
bananas
cherries

get_last_chunk 29 file.txt
cherries

答え3

最終$1%数量を取得するにはワイヤー、移植可能(POSIXly):

last_percent() (
  percent=${1?}; shift
  ret=0
  for file do
    lines=$(wc -l < "$file") &&
      tail -n "$((lines * percent / 100))" < "$file" || ret=$?
  done
  exit "$ret"
)

例:

$ seq 12 > a; printf '%s\n' aaaaaa bbbbb cccc dd > b
$ last_percent 25 a b
10
11
12
dd

$1数量の最後の%についてバイトwc -lおよびに置き換えられました。ただし、最初の出力ラインが部分的になる可能性があることに注意してください。上記と同じファイルには次のものがあります。wc -ctail -ntail -c

$ last_percent 25 a b
11
12
c
dd

ksh93では、次のように単一のフォークではなく組み込み関数のみを使用して作成できます。

last_percent() (
  percent=$1; shift
  ret=0
  for file do
    command /opt/ast/bin/cat < "$file" <#((EOF*(100-percent)/100)) || ret=$?
  done
  exit "$ret"
)

検索演算子を使用してください<#((...))

以下と同じですzshcat組み込まれていない場合を除く)。

zmodload zsh/system zsh/stat
last_percent() {
  local percent=$1 ret=0 file n
  shift
  for file do
    {
      sysseek -w end 0 &&
        sysseek -w end ' - systell(0) * percent / 100' &&
        cat
    } < $file || ret=$?
  done
  return $ret
}

関連情報