我有一个文件,内容如下:
|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脚本或同步或sed
或awk
告诉我如何实现这一目标。
答案 0 :(得分:0)
我仍然有点不清楚你想要什么,但我想我已经足够给你一个关于bash解决方案的大纲。我不清楚的部分是哪一行包含10
和剩余0
的前两个字符,但看起来这是每批中的最后一行。我不确切地知道您希望如何处理批处理(匹配10
),我只是将剩余的所需批处理编写到当前工作目录中名为newbatch.txt
的文件中。
脚本的基本概要是将每个批处理读入临时数组。如果在阅读期间找到了10
和0
的匹配项,则会设置一个标记来删除批处理。读取最后一行后,它会检查标志,如果设置,则只输出要删除的批号。如果未设置该标志,则将批次写入./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