Lewati 3 byte pertama file


11

Saya menggunakan shell AIX 6.1 ksh.

Saya ingin menggunakan satu liner untuk melakukan sesuatu seperti ini:

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

Saya ingin melewati 3 byte pertama dari baris pertama; apakah ada cara untuk melakukan ini?

Jawaban:


18

Sekolah lama - Anda bisa menggunakan dd:

dd if=A_FILE bs=1 skip=3

File inputnya adalah A_FILE, ukuran blok adalah 1 karakter (byte), lewati 3 'blok' pertama (byte). (Dengan beberapa varian ddseperti GNU dd, Anda dapat menggunakan di bs=1csini - dan alternatif suka bs=1kmembaca dalam blok 1 kilobyte dalam keadaan lain. ddTampaknya pada AIX tidak mendukung ini, tampaknya; varian BSD (macOS Sierra) tidak mendukung ctetapi tidak mendukung k, m, g, dll)

Ada cara lain untuk mencapai hasil yang sama juga:

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

Ini berfungsi jika ada 3 karakter atau lebih di baris pertama.

tail -c +4 A_FILE

Dan Anda bisa menggunakan Perl, Python dan sebagainya juga.


Terima kasih atas bantuan Anda. Perintah sed dan tail bekerja di AIX 6.1. Untuk perintah dd, harus dd if=A_FILE bs=1 skip=3dalam AIX 6.1
Alvin SIU

Anda mungkin ingin menggunakan input standar seperti kucing A_FILE | tail -c +4 dengan gnu.
MUY Belgium

14

Alih-alih menggunakan catAnda dapat menggunakan tailseperti itu:

tail -c +4 FILE

Ini akan mencetak seluruh file kecuali untuk 3 byte pertama. Konsultasikan man tailuntuk informasi lebih lanjut.


Tidak tahu tentang AIX, tetapi pada Solaris Anda harus menggunakan /usr/xpg4/bin/tail, setidaknya di komputer saya. Meskipun begitu, tip yang bagus!
BellevueBob

1
@ BobDuell Sulit memposting sesuatu yang kompatibel dengan setiap OS.
squiguy

Ya, ini berfungsi di AIX 6.1
Alvin SIU

@AlvinSIU Senang tahu. Senang aku dapat membantu.
squiguy

0

Saya perlu melakukan sesuatu yang serupa baru-baru ini. Saya membantu dengan masalah dukungan lapangan dan perlu membiarkan teknisi melihat plot waktu nyata saat mereka melakukan perubahan. Data dalam log biner yang tumbuh sepanjang hari. Saya memiliki perangkat lunak yang dapat menguraikan dan memplot data dari log, tetapi saat ini tidak real time. Apa yang saya lakukan adalah menangkap ukuran log sebelum saya mulai memproses data, kemudian masuk ke loop yang akan memproses data dan setiap pass membuat file baru dengan byte file yang belum diproses.

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

Kalau saja karena aku sedang dalam mood seperti itu, dan tidak suka coding terhadap output dari ls; sudahkah Anda mempertimbangkan untuk menggunakan stat -c'%s' "${IFILE}"bukannya ls|awkkombo itu? Yaitu, dengan asumsi GNU coreutils ...
jimbobmcgee

0

Jika seseorang memiliki Python di sistem mereka, seseorang dapat menggunakan skrip python kecil untuk memanfaatkan seek()fungsi untuk mulai membaca pada byte ke-n seperti ini:

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

Dan penggunaannya akan seperti ini:

$ ./skip_bytes.py input.txt 3

Perhatikan bahwa jumlah byte dimulai pada 0 (dengan demikian byte pertama sebenarnya indeks 0), sehingga dengan menentukan 3 kita secara efektif memposisikan pembacaan dimulai pada 3 + 1 = byte 4

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.