파일의 백분율을 얻으십시오

파일의 백분율을 얻으십시오

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

검색 연산자 를 사용하세요 <#((...)).

다음과 동일합니다 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
}

관련 정보