我想从文件中删除批处理

时间:2015-03-21 05:03:26

标签: shell unix

我有一个文件,内容如下:

|T1234
010000000000
02123456878
05122345600000000000000
07445678920000000000000
09000000000123000000000
10000000000000000000000
.T1234
|T798
013457829
0298365799
05600002222222222222222
09348977722220000000000
10000057000004578933333
.T798

这里一个完整的批处理意味着它将从| T开始并以.T结束。 在文件中我有2批。

我想编辑此文件以删除记录10(位置1-2)的批次,如果从位置3到位置20为0则删除批次。

请通过编写shell脚本或同步或sedawk告诉我如何实现这一目标。

1 个答案:

答案 0 :(得分:0)

我仍然有点不清楚你想要什么,但我想我已经足够给你一个关于bash解决方案的大纲。我不清楚的部分是哪一行包含10和剩余0的前两个字符,但看起来这是每批中的最后一行。我不确切地知道您希望如何处理批处理(匹配10),我只是将剩余的所需批处理编写到当前工作目录中名为newbatch.txt的文件中。

脚本的基本概要是将每个批处理读入临时数组。如果在阅读期间找到了100的匹配项,则会设置一个标记来删除批处理。读取最后一行后,它会检查标志,如果设置,则只输出要删除的批号。如果未设置该标志,则将批次写入./newbatch.txt

如果您的要求不同,请告诉我,但这应该非常接近解决方案。代码评论相当好。如果您有任何疑问,请发表评论。

#!/bin/bash

ifn=${1:-dat/batch.txt}  # input filename
ofn=./newbatch.txt       # output filename

:>"$ofn"                 # truncate output filename

declare -i bln=0         # batch line number
declare -i delb=0        # delete batch flag
declare -a ba            # temporary batch array

[ -r "$ifn" ] || {       # test input file readable
    printf "error: file not readable.  usage: %s filename\n" "${0//*\//}"
    exit 1
}

## read each line in input file
while read -r line || test -n "$line"; do

    printf "   %d  %s\n" $bln "$line"
    ba+=( "$line" )      # add line to array

    ## if chars 1-2 == 10 and chars 3 on == 00...
    if [ ${line:0:2} == 10 -a ${line:3} == 00000000000000000000 ]; then
        delb=1           # set delete flag
    fi

    ((bln++))            # increment line number

    ## if the line starts with '.'
    if [ ${line:0:1} == '.' ]; then

        ## if the delete batch flag is set
        if [ $delb -eq 1 ]; then
            ## do nothing (but show batch no. to delete)
            printf " => deleting batch : %s\n" "${ba[0]}"

        ## if delb not set, then write the batch to output file
        else
            printf "%s\n" ${ba[@]} >> "$ofn"
        fi

        ## reset line no., flags, and uset array.
        bln=0
        delb=0
        unset ba
    fi

done <"$ifn"

exit 0

输出(到标准输出)

$ bash batchdel.sh
   0  |T1234
   1  010000000000
   2  02123456878
   3  05122345600000000000000
   4  07445678920000000000000
   5  09000000000123000000000
   6  10000000000000000000000
   7  .T1234
 => deleting batch : |T1234
   0  |T798
   1  013457829
   2  0298365799
   3  05600002222222222222222
   4  09348977722220000000000
   5  10000057000004578933333
   6  .T798

输出(到newbatch.txt)

$ cat newbatch.txt
|T798
013457829
0298365799
05600002222222222222222
09348977722220000000000
10000057000004578933333
.T798