Bir dosyanın ilk 3 baytını atla


11

AIX 6.1 ksh kabuğu kullanıyorum.

Böyle bir şey yapmak için bir astar kullanmak istiyorum:

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

İlk satırın ilk 3 baytını atlamak istiyorum; Bunu yapmanın bir yolu var mı?

Yanıtlar:


19

Eski okul - şunları kullanabilirsiniz dd:

dd if=A_FILE bs=1 skip=3

Giriş dosyası, A_FILEblok boyutu 1 karakterdir (bayt), ilk 3 'bloğu' (bayt) atlar. ( ddGNU gibi bazı varyantlarında, burada ddkullanabilirsiniz bs=1c- ve bs=1kdiğer durumlarda 1 kilobaytlık bloklar halinde okumak gibi alternatifler . ddAIX'te bunu desteklemiyor gibi görünüyor; BSD (macOS Sierra) varyantı desteklemiyor cama does destek k, m, gvs.)

Aynı sonucu elde etmenin başka yolları da vardır:

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

İlk satırda 3 veya daha fazla karakter varsa bu işe yarar.

tail -c +4 A_FILE

Ve Perl, Python ve benzerlerini de kullanabilirsiniz.


Yardımın için teşekkürler. Hem sed hem de tail komutları AIX 6.1'de çalışır. Dd komutu için dd if=A_FILE bs=1 skip=3, AIX 6.1'de olmalıdır
Alvin SIU

A_FILE cat gibi standart girdi kullanmak isteyebilirsiniz | kuyruk - gnu ile c + 4.
MUY Belçika

15

Kullanmak yerine catşu şekilde kullanabilirsiniz tail:

tail -c +4 FILE

Bu, ilk 3 bayt dışında tüm dosyayı yazdırır. man tailDaha fazla bilgi için danışın .


AIX'i bilmiyorum, ama Solaris'te /usr/xpg4/bin/tailen azından makinemde kullanmalısın . Yine de iyi ipucu!
BellevueBob

1
@BobDuell Her işletim sistemi ile uyumlu bir şey göndermek zor.
squiguy

Evet, AIX 6.1'de çalışıyor
Alvin SIU

@AlvinSIU Bilmek güzel. Yardımcı olduğuma sevindim.
squiguy

0

Son zamanlarda benzer bir şey yapmam gerekiyordu. Bir saha destek sorununa yardımcı oluyordum ve bir teknisyenin değişiklik yaparken gerçek zamanlı grafikleri görmesine izin vermeliydim. Veriler, gün boyunca büyüyen ikili bir günlüktedir. Günlüklerden verileri ayrıştırabilen ve çizebilen yazılımım var, ancak şu anda gerçek zamanlı değil. Yaptığım şey, verileri işlemeye başlamadan önce günlüğün boyutunu yakalamaktı, daha sonra verileri işleyecek bir döngüye girdi ve her geçiş henüz işlenmemiş olan dosyanın baytlarıyla yeni bir dosya oluşturdu.

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

Sadece bu tür bir ruh halinde olduğum için ve çıktısına karşı kodlamayı sevmiyorum ls; stat -c'%s' "${IFILE}"bu ls|awkkombo yerine kullanmayı düşündün mü? Yani, GNU coreutils
varsayalım

0

Sisteminde Python varsa seek(), nth baytında okumaya başlamak için fonksiyondan yararlanmak için küçük python betiği kullanılabilir :

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

Ve kullanım şöyle olurdu:

$ ./skip_bytes.py input.txt 3

Bayt sayısının 0'da başladığını unutmayın (bu nedenle ilk bayt aslında dizin 0'dır), bu nedenle 3'ü belirterek okumayı 3 + 1 = 4. baytta başlayacak şekilde etkili bir şekilde konumlandırıyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.