Замените последние 3 нуля каждой строки в файле с добавочным счетчиком, например, 001,002 и т. Д., Используя сценарий оболочки Unix - PullRequest
0 голосов
/ 01 октября 2018

У меня есть требование, где мой файл в настоящее время выглядит следующим образом:

 XXXXXXX    290D           00         000000000    
 XXXXXXX    290D           00         000000000    
 XXXXXXX    290D           00         000000000  

, и требование состоит в том, чтобы заменить нули в последних столбцах добавочным счетчиком.то есть вывод должен выглядеть следующим образом:

XXXXXXX    290D           00         000000001    
XXXXXXX    290D           00         000000002    
XXXXXXX    290D           00         000000003

..................................... 000000010 и так далее.Я новичок в Unix и попытался написать следующий код:

#!/bin/ksh

cd /test
find_list=`find Test_File_* -type f`
for file in $find_list
do
    string=$( cat $file |head -2) ;
    grep -E -i '00000000' Test_File_*
    typeset -Z9 number
    number=000
    echo $number
    ((number=++number))
    echo $number
    exit 0
done

Но он дал мне 2 новые строки с увеличенным счетчиком, что не является моим требованием.Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Может быть, что-то вроде этого:

#!/bin/ksh

typeset -RZ9 number

cd /test

for file in Test_File_*.txt; do
        if [[ -f $file ]]; then
                number=0
                #Doing backup of the original file. 
                mv $file $file".bck"
                while read line; do
                        newLine=$(sed 's|000000000|'$number'|g' <<< "$line")
                        print "$newLine" >> $file
                        ((number++))
        # You don't mention what to do after 999 so I put it back at 0                
                        if [[ $number -gt 999 ]]; then
                             number=0
                        fi
                done < $file".bck"
        fi
done

Кстати, с помощью ksh вы можете использовать «print» вместо «echo».echo - это внешний двоичный файл, а print - встроенная команда.

Надеюсь, что это может помочь

0 голосов
/ 01 октября 2018

Этот awk не делает никаких предположений о количестве записей в файле:

awk '{$NF = sprintf("%0*d", length($NF), NR)} 1' file

, но это разрушает интервал между полями:

XXXXXXX 290D 00 000000001
XXXXXXX 290D 00 000000002
XXXXXXX 290D 00 000000003

Немного сложнее - замените последнее слово на нужное число:

awk '{sub(/0+[[:blank:]]*$/, sprintf("%0*d", length($NF), NR))} 1' file
XXXXXXX    290D           00         000000001
XXXXXXX    290D           00         000000002
XXXXXXX    290D           00         000000003
0 голосов
/ 01 октября 2018

Если вы знаете, что все строки заканчиваются на «000» (и без пробелов!), Вы хотите нумеровать строки последовательно, начиная с «001», и у вас не будет более 999 строк:

$ cat myfile
 XXXXXXX    290D           00         000000000
 XXXXXXX    290D           00         000000000
 XXXXXXX    290D           00         000000000

$ awk  '{printf "%s%03d\n", substr($0,1,length($0)-3), NR}'  myfile
 XXXXXXX    290D           00         000000001
 XXXXXXX    290D           00         000000002
 XXXXXXX    290D           00         000000003
  • substr($0,1,length($0)-3) => убрать последние 3 символа
  • printf "%s%03d\n" - первая позиция (% s), заполненная результатами вызова substr();вторая позиция (% 03d) - заполнение нулями номера строки записи (NR);не забывайте возврат каретки / перевод строки (\ n)
  • , если у вас более 999 строк, тогда %03d фактически выдаст 4/5/6-значный вывод (при условии 4/5/6-значное)номера строк)

Если в некоторых строках могут быть ненулевые значения в последних 3 позициях, и вы не хотите перезаписывать указанные цифры, но вы хотите продолжить перенумерацию 000 (последовательно, начиная с'001'):

$ cat myfile
 XXXXXXX    290D           00         000000000
 XXXXXXX    290D           00         000000456  <=== leave this one as is
 XXXXXXX    290D           00         000000000

# adding some white space for readability ...

$ awk  '
BEGIN  { mycount=1 }
/000$/ { printf "%s%03d\n", substr($0,1,length($0)-3), mycount; mycount++ ; next }
       { print }
' myfile

 XXXXXXX    290D           00         000000001
 XXXXXXX    290D           00         000000456
 XXXXXXX    290D           00         000000002
  • mycount=1 - инициализировать наш счетчик конца строки
  • /000$/ - если строка заканчивается на «000», выдают то же самоеprintf, как в предыдущем примере, заменив номер текущей строки (NR) нашим счетчиком (mycount)
  • mycount++ ; next - увеличьте наш счетчик, перейдите к следующей строке в файле
  • { print }- если шаблон (/ 000 $ /) не совпадает, выведите всю строку
...