Я все еще немного неясен о том, что вы хотите, но я думаю, что у меня его достаточно, чтобы дать вам схему решения bash. Часть, на которой я была неясна, - это именно та строка, которая содержит первые два символа 10
и остальные 0
, но похоже, что это последняя строка в каждой партии. Не зная точно, как вы хотели, чтобы пакет (с совпадением 10
) обрабатывался, я просто написал оставшиеся пакеты (ы) в файл с именем newbatch.txt
в текущем рабочем каталоге.
Основной контур сценария - читать каждую партию во временном массиве. Если во время чтения найдено совпадение и 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 0900000000
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
вы сделали попытку? – tharif
Да .... я пытался написать оператор if else, но я не знаю, как поставить условия, а затем удалить строки. –
_ "запись 10 (позиция1-2), если с позиции 3 до позиции 20" _ Для вашего формата файла, как определяется номер записи и номер позиции? Учитывая ваш пример ввода, что вы ожидаете от вывода проб? – John1024