किसी फ़ाइल के पहले 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 'ब्लॉक' (बाइट) को छोड़ें। ( ddजीएनयू जैसे कुछ वेरिएंट के साथ dd, आप bs=1cयहां इस्तेमाल कर सकते हैं - और विकल्प bs=1kअन्य परिस्थितियों में 1 किलोबाइट के ब्लॉक में पढ़ना पसंद करते हैं। ddएआईएक्स इस पर समर्थन नहीं करता है, ऐसा लगता है; बीएसडी (मैकओएस सिएरा) वेरिएंट का समर्थन करता है। cलेकिन करता है समर्थन k, m, g, आदि)

समान परिणाम प्राप्त करने के अन्य तरीके भी हैं:

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

यह काम करता है अगर पहली पंक्ति पर 3 या अधिक वर्ण हैं।

tail -c +4 A_FILE

और आप पर्ल, पायथन आदि का भी उपयोग कर सकते हैं।


आपकी सहायता के लिए धन्यवाद। दोनों सेड और टेल कमांड AIX 6.1 में काम करते हैं। Dd कमांड के लिए, यह dd if=A_FILE bs=1 skip=3AIX 6.1 में होना चाहिए
एल्विन SIU

आप ऐसी बिल्ली A_FILE के रूप में मानक इनपुट का उपयोग करना चाह सकते हैं पूंछ -c +4 गन्नू के साथ।
MUY बेल्जियम

15

उपयोग करने के बजाय catआप tailइस तरह का उपयोग कर सकते हैं :

tail -c +4 FILE

यह पहले 3 बाइट को छोड़कर पूरी फाइल का प्रिंट आउट लेगा। man tailअधिक जानकारी के लिए परामर्श करें ।


AIX के बारे में नहीं जानते, लेकिन Solaris पर आपको /usr/xpg4/bin/tailकम से कम मेरी मशीन का उपयोग करना चाहिए । फिर भी अच्छा टिप!
बेलेव्यूबेक्यू

1
@BusDuell कुछ ऐसा पोस्ट करना कठिन है जो हर OS के अनुकूल हो।
स्क्विजुय

हां, यह AIX 6.1 में काम करता है
एल्विन SIU

@AlvinSIU जानकर अच्छा लगा। मैं खुशी से मदद कर सकता है।
स्क्विजु ऑक्ट

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
कोरुटिल्स मानकर

0

यदि किसी के पास अपने सिस्टम पर पायथन है, तो कोई भी छोटे seek()बाइट लिपि का उपयोग कर सकता है ताकि फ़ंक्शन का लाभ उठा सके।

#!/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 पर बाइट शुरू करने के लिए रीडिंग को प्रभावी ढंग से पोजिशन कर रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.