मैं AIX 6.1 ksh शेल का उपयोग कर रहा हूं।
मैं कुछ ऐसा करने के लिए एक लाइनर का उपयोग करना चाहता हूं:
cat A_FILE | skip-first-3-bytes-of-the-file
मैं पहली पंक्ति के पहले 3 बाइट्स को छोड़ना चाहता हूं; क्या इसे करने का कोई तरीका है?
मैं AIX 6.1 ksh शेल का उपयोग कर रहा हूं।
मैं कुछ ऐसा करने के लिए एक लाइनर का उपयोग करना चाहता हूं:
cat A_FILE | skip-first-3-bytes-of-the-file
मैं पहली पंक्ति के पहले 3 बाइट्स को छोड़ना चाहता हूं; क्या इसे करने का कोई तरीका है?
जवाबों:
पुराने स्कूल - आप उपयोग कर सकते हैं 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
और आप पर्ल, पायथन आदि का भी उपयोग कर सकते हैं।
उपयोग करने के बजाय cat
आप tail
इस तरह का उपयोग कर सकते हैं :
tail -c +4 FILE
यह पहले 3 बाइट को छोड़कर पूरी फाइल का प्रिंट आउट लेगा। man tail
अधिक जानकारी के लिए परामर्श करें ।
/usr/xpg4/bin/tail
कम से कम मेरी मशीन का उपयोग करना चाहिए । फिर भी अच्छा टिप!
मुझे हाल ही में कुछ ऐसा ही करने की जरूरत थी। मैं एक क्षेत्र समर्थन मुद्दे के साथ मदद कर रहा था और एक तकनीशियन को वास्तविक समय के भूखंडों को देखने देने की आवश्यकता थी क्योंकि वे बदलाव कर रहे थे। डेटा एक बाइनरी लॉग में है जो पूरे दिन बढ़ता है। मेरे पास ऐसे सॉफ़्टवेयर हैं जो लॉग से डेटा को पार्स और प्लॉट कर सकते हैं, लेकिन वर्तमान में यह वास्तविक समय नहीं है। मैंने जो कुछ भी किया था, उससे पहले मैंने डेटा को संसाधित करना शुरू किया था, फिर लॉग का आकार कैप्चर किया गया, फिर एक लूप में गया, जो डेटा को प्रोसेस करेगा और प्रत्येक पास उस फ़ाइल के बाइट्स के साथ एक नई फ़ाइल बनाता है जिसे अभी तक संसाधित नहीं किया गया था।
#!/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
यदि किसी के पास अपने सिस्टम पर पायथन है, तो कोई भी छोटे 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 पर बाइट शुरू करने के लिए रीडिंग को प्रभावी ढंग से पोजिशन कर रहे हैं।
dd if=A_FILE bs=1 skip=3
AIX 6.1 में होना चाहिए