파일의 처음 3바이트 건너뛰기

파일의 처음 3바이트 건너뛰기

저는 AIX 6.1 ksh 쉘을 사용하고 있습니다.

라이너를 사용하여 다음과 같은 작업을 수행하고 싶습니다.

cat A_FILE | skip-first-3-bytes-of-the-file

첫 번째 줄의 처음 3바이트를 건너뛰고 싶습니다. 이를 수행할 수 있는 방법이 있습니까?

답변1

올드 스쿨 - 다음을 사용할 수 있습니다 dd:

dd if=A_FILE bs=1 skip=3

입력 파일은 이고 A_FILE블록 크기는 1자(바이트)이며 처음 3개의 "청크"(바이트)를 건너뜁니다. ( ddGNU와 같은 일부 변형의 경우 여기에서 사용할 dd수 있으며 다른 경우에는 1KB 청크로 읽는 것과 bs=1c같은 대안도 사용할 수 있습니다. 이 기능은 AIX에서는 지원되지 않는 것으로 보입니다. BSD(macOS Sierra) 변형은 지원되지 않습니다. 지원하지는 않지만 , 등 은 지원합니다 .)bs=1kddckmg

동일한 결과를 얻는 다른 방법도 있습니다.

sed '1s/^...//' A_FILE

이 방법은 첫 번째 줄에 3자 이상의 문자가 있는 경우에 작동합니다.

tail -c +4 A_FILE

Perl, Python 등을 사용할 수도 있습니다.

답변2

cat사용하는 대신 tail:

tail -c +4 FILE

그러면 처음 3바이트를 제외한 전체 파일이 인쇄됩니다. 더 많은 정보를 요청하세요 man tail.

답변3

seek()시스템에 Python이 있는 경우 작은 Python 스크립트를 사용하여 다음과 같이 n번째 바이트부터 읽는 함수를 활용할 수 있습니다 .

#!/usr/bin/env python3
import sys
with open(sys.argv[1],'rb') as fd:
    fd.seek(int(sys.argv[2]))
    for line in fd:
        print(line.decode().strip())

사용법은 다음과 같습니다:

$ ./skip_bytes.py input.txt 3

바이트 수는 0에서 시작하므로(첫 번째 바이트는 실제로 인덱스 0임) 3을 지정하면 읽기가 3+1=4번째 바이트에서 시작하도록 효과적으로 배치됩니다.

답변4

나는 최근에 비슷한 일을 해야 했습니다. 저는 현장 지원 문제를 돕고 있는데 기술자가 변경 사항이 적용되면 실시간 도면을 볼 수 있도록 허용해야 합니다. 데이터는 하루 종일 증가하는 바이너리 로그에 있습니다. 로그 데이터를 구문 분석하고 표시할 수 있는 소프트웨어가 있지만 현재는 작동하지 않습니다. 내가 하는 일은 데이터 처리를 시작하기 전에 로그 크기를 캡처한 다음 데이터를 처리하는 루프를 입력하는 것입니다. 각 패스는 아직 처리되지 않은 파일의 바이트로 새 파일을 생성합니다.

#!/usr/bin/env bash

# I named this little script hackjob.sh
# The purpose of this is to process an input file and load the results into
# a database. The file is constantly being update, so this runs in a loop
# and every pass it creates a new temp file with bytes that have not yet been
# processed.  It runs about 15 seconds behind real time so it's
# pseudo real time.  This will eventually be replaced by a real time
# queue based version, but this does work and surprisingly well actually.

set -x

# Current data in YYYYMMDD fomat
DATE=`date +%Y%m%d`

INPUT_PATH=/path/to/my/data
IFILE1=${INPUT_PATH}/${DATE}_my_input_file.dat

OUTPUT_PATH=/tmp
OFILE1=${OUTPUT_PATH}/${DATE}_my_input_file.dat

# Capture the size of the original file
SIZE1=`ls -l ${IFILE1} | awk '{print $5}'`

# Copy the original file to /tmp
cp ${IFILE1} ${OFILE1}

while :
do
    sleep 5

    # process_my_data.py ${OFILE1}
    rm ${OFILE1}
    # Copy IFILE1 to OFILE1 minus skipping the amount of data already processed
    dd skip=${SIZE1} bs=1 if=${IFILE1} of=${OFILE1}
    # Update the size of the input file
    SIZE1=`ls -l ${IFILE1} | awk '{print $5}'`

    echo

    DATE=`date +%Y%m%d`

done

관련 정보