파일의 마지막 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
-는 각각 함수의 첫 번째 및 두 번째 매개변수입니다.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
}