2015-03-21 3 views
1

У меня есть файл и содержимое, как:Я хочу удалить пакет из файла

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

Здесь одна полная партии означает, что она будет начинаться с | Т и заканчивается .T. В файле у меня 2 партии.

Я хочу отредактировать этот файл, чтобы удалить партию для записи 10 (позиция1-2), если с позиции 3 до позиции 20 равен 0, тогда удалите пакет.

Пожалуйста, дайте мне знать, как я могу достичь этого, написав сценарий оболочки или syncsort или sed или awk.

+0

вы сделали попытку? – tharif

+0

Да .... я пытался написать оператор if else, но я не знаю, как поставить условия, а затем удалить строки. –

+1

_ "запись 10 (позиция1-2), если с позиции 3 до позиции 20" _ Для вашего формата файла, как определяется номер записи и номер позиции? Учитывая ваш пример ввода, что вы ожидаете от вывода проб? – John1024

ответ

0

Я все еще немного неясен о том, что вы хотите, но я думаю, что у меня его достаточно, чтобы дать вам схему решения 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 
Смежные вопросы