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


11

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

하나의 라이너를 사용하여 다음과 같이하십시오.

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

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

답변:


19

구식 — 다음을 사용할 수 있습니다 dd.

dd if=A_FILE bs=1 skip=3

입력 파일은 A_FILE블록 크기는 1 자 (바이트)이며 처음 3 개의 '블록'(바이트)은 건너 뜁니다. ( ddGNU와 같은 일부 변형을 dd사용하면 다른 환경에서 1 킬로바이트 블록으로 읽을 수있는 bs=1c대안을 사용할 수 있습니다 bs=1k. ddAIX에서는이를 지원하지 않는 것 같습니다. BSD (macOS Sierra) 변형은 지원하지 않습니다. c하지만 수행 지원 k, m, g, 등)

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

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

첫 줄에 3 개 이상의 문자가있는 경우 작동합니다.

tail -c +4 A_FILE

그리고 Perl, Python 등도 사용할 수 있습니다.


당신의 도움을 주셔서 감사합니다. sed 및 tail 명령은 모두 AIX 6.1에서 작동합니다. dd 명령의 경우, dd if=A_FILE bs=1 skip=3AIX 6.1에 있어야합니다
Alvin SIU

다음과 같은 표준 입력을 사용할 수 있습니다. cat A_FILE | gnu를 가진 꼬리 -c +4.
MUY Belgium

15

사용하는 대신 다음과 같이 사용할 cat수 있습니다 tail.

tail -c +4 FILE

처음 3 바이트를 제외한 전체 파일이 인쇄됩니다. man tail자세한 내용은 문의하십시오 .


AIX에 대해 모르지만 Solaris /usr/xpg4/bin/tail에서는 적어도 내 시스템에서을 사용해야 합니다. 그럼에도 불구하고 좋은 팁!
BellevueBob

1
@BobDuell 모든 OS와 호환되는 것을 게시하기는 어렵습니다.
squiguy

네, AIX 6.1에서 작동
앨빈 SIU

@AlvinSIU 알고 싶습니다. 기꺼이 도와 드리겠습니다.
squiguy

0

최근에 비슷한 일을해야했습니다. 현장 지원 문제를 돕고 있었으며 기술자가 변경을 할 때 실시간 도표를 볼 수 있도록해야했습니다. 데이터는 하루 종일 증가하는 이진 로그에 있습니다. 로그에서 데이터를 구문 분석하고 플롯 할 수있는 소프트웨어가 있지만 현재는 실시간이 아닙니다. 내가 한 것은 데이터 처리를 시작하기 전에 로그 크기를 캡처 한 다음 데이터를 처리하는 루프로 들어가고 각 패스는 아직 처리되지 않은 파일의 바이트로 새 파일을 만듭니다.

#!/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

내가 그런 종류의 분위기에 있기 때문에 단지 출력에 대해 코딩하는 것을 좋아하지 않는다면 ls; stat -c'%s' "${IFILE}"ls|awk콤보 대신 사용을 고려 했습니까? 즉, GNU coreutils를 가정하면 ...
jimbobmcgee

0

시스템에 파이썬이있는 경우 작은 파이썬 스크립트를 사용 seek()하여 다음과 같이 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 번째 바이트에서 시작하도록 판독 값을 효과적으로 배치합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.