跳过文件的前3个字节


11

我正在使用AIX 6.1 ksh shell。

我想用一根班轮做这样的事情:

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

我想跳过第一行的前3个字节;有没有办法做到这一点?

Answers:


18

老学校-您可以使用dd

dd if=A_FILE bs=1 skip=3

输入文件为A_FILE,块大小为1个字符(字节),跳过前3个“块”(字节)。(对于某些dd类似GNU的变体dd,您可以bs=1c在这里使用-以及其他选择,例如bs=1k在其他情况下以1 KB的块读取。dd似乎在AIX上不支持此功能; BSD(macOS Sierra)变体不支持c但是不支持kmg,等)

还有其他方法可以达到相同的结果:

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

如果第一行有3个或更多字符,则此方法有效。

tail -c +4 A_FILE

您也可以使用Perl,Python等。


谢谢你的帮助。sed和tail命令都可以在AIX 6.1中使用。对于dd命令,它应该dd if=A_FILE bs=1 skip=3在AIX 6.1
Alvin SIU 2012年

您可能要使用标准输入,例如cat A_FILE |。尾巴-c +4和gnu。
MUY比利时

14

除了使用,cat您可以这样使用tail

tail -c +4 FILE

这将打印出整个文件,但前3个字节除外。请咨询man tail以获取更多信息。


不了解AIX,但/usr/xpg4/bin/tail至少在我的机器上必须在Solaris上使用。尽管如此,还是不​​错的提示!
BellevueBob 2012年

1
@BobDuell很难发布与每个OS兼容的东西。
squiguy 2012年

是的,它工作在AIX 6.1
阿尔文SIU

@AlvinSIU很高兴知道。很高兴我能帮上忙。
squiguy 2012年

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 16-10-26

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个字节开始

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.