কোনও ফাইলের প্রথম 3 বাইট ছেড়ে যান


11

আমি এআইএক্স 6.1 কেএসএল শেল ব্যবহার করছি।

আমি এই জাতীয় কিছু করতে একটি লাইনার ব্যবহার করতে চাই:

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 'ব্লক' (বাইট) এড়িয়ে যান। (জিএনইউর ddমতো কিছু বৈকল্পিকের সাহায্যে ddআপনি bs=1cএখানে ব্যবহার করতে পারেন - এবং bs=1kঅন্যান্য পরিস্থিতিতে 1 কিলোবাইটের ব্লকগুলির বিকল্পগুলি পড়তে পছন্দ ddকরেন AI cকিন্তু না সমর্থন k, m, g, ইত্যাদি)

একই ফলাফল অর্জনের অন্যান্য উপায়ও রয়েছে:

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

প্রথম লাইনে 3 বা ততোধিক অক্ষর থাকলে এটি কাজ করে।

tail -c +4 A_FILE

এবং আপনি পার্ল, পাইথন এবং আরও অনেক কিছু ব্যবহার করতে পারেন।


আপনার সাহায্যের জন্য ধন্যবাদ. সেড এবং লেজ কমান্ড উভয়ই এআইএক্স 6.1 এ কাজ করে। ডিডি কমান্ডের জন্য, এটি dd if=A_FILE bs=1 skip=3এআইএক্স 6.1
এলভিন এসআইইউ

আপনি যেমন বিড়াল A_FILE | হিসাবে স্ট্যান্ডার্ড ইনপুট ব্যবহার করতে চাইতে পারেন লেবু -c +4 gnu সঙ্গে।
MUY বেলজিয়াম

15

পরিবর্তে catআপনি tailযেমন ব্যবহার করতে পারেন :

tail -c +4 FILE

এটি প্রথম 3 বাইট বাদে পুরো ফাইলটি মুদ্রণ করবে। man tailআরও তথ্যের জন্য পরামর্শ করুন।


এআইএক্স সম্পর্কে জানেন না, তবে সোলারিসে আপনাকে অবশ্যই ব্যবহার করতে হবে /usr/xpg4/bin/tail, কমপক্ষে আমার মেশিনে। তবুও ভাল টিপ!
BellevueBob

1
@ BobDuell প্রতিটি ওএসের সাথে সামঞ্জস্যপূর্ণ এমন কিছু পোস্ট করা শক্ত।
স্কুইগ্যুই

হ্যাঁ, এটি এআইএক্স 6.1 এ কাজ করে
অ্যালভিন এসআইইউ

@ অ্যালভিনএসআইইউ জেনে রাখা ভাল। আমি সাহায্য করতে পেরে আনন্দিত.
স্কিগুইয়

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কম্বো পরিবর্তে ব্যবহার বিবেচনা করেছেন ? এটি হ'ল জিএনইউ
কোর্টিলসকে

0

যদি কারও সিস্টেমে পাইথন থাকে তবে কেউ seek()nth বাইটে পড়া শুরু করার জন্য ফাংশনটির সুবিধা নিতে ছোট পাইথন স্ক্রিপ্ট ব্যবহার করতে পারে :

#!/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 th বাইটে পড়া শুরু করতে পারি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.