ファイルの最後の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/N
Nの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 $2
N
- ファイルの最後のバイトを取得します。
または、より単純化されたバージョンを使用してください。
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 -c
tail -n
tail -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"
)
検索演算子を使用してください<#((...))
。
以下と同じですzsh
(cat
組み込まれていない場合を除く)。
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
}