Пропустіть перші 3 байти файлу


11

Я використовую оболонку AIX 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такими як GNU dd, ви можете використовувати bs=1cтут - і альтернативи, як bs=1kчитати в блоках по 1 кілобайт за інших обставин. На ddAIX це не підтримує, здається; варіант BSD (macOS Sierra) не підтримує cале підтримує k, m, gі т.д.)

Є й інші способи досягти того ж результату:

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

Це працює, якщо в першому рядку є 3 або більше символів.

tail -c +4 A_FILE

І ви також можете використовувати Perl, Python тощо.


Спасибі за вашу допомогу. Команди sed і хвоста працюють в AIX 6.1. Для команди dd це повинно бути dd if=A_FILE bs=1 skip=3в AIX 6.1
Alvin SIU

Ви можете використовувати стандартний вхід як такий кіт A_FILE | хвіст -c +4 з гну.
МУП Бельгія

15

Замість використання catви можете використовувати tailяк таке:

tail -c +4 FILE

Це виведе весь файл, за винятком перших 3 байтів. Зверніться man tailза додатковою інформацією.


Не знаю про AIX, але на Solaris ви повинні користуватися /usr/xpg4/bin/tail, принаймні, на моїй машині. Хороший рада все-таки!
BellevueBob

1
@BobDuell Важко розмістити щось, сумісне з кожною ОС.
squiguy

Так, це працює в AIX 6.1
Alvin SIU

@AlvinSIU Приємно знати. Радий, що можу допомогти.
squiguy

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 coreutils ...
jimbobmcgee

0

Якщо в їхній системі є Python, можна скористатися невеликим сценарієм python, щоб скористатися seek()функцією, щоб почати читати в n-му байті так:

#!/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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.