преобразование вывода из строки в целое число - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь запрограммировать небольшой инструмент, который объединяет некоторые файлы на сервере Unix.Теперь я вынужден объединить 20 файлов в 1. Все эти файлы содержат заголовок и трейлер, которые необходимо удалить, а новый созданный файл должен иметь заголовок и трейлер.заголовок и трейлер немного сложны для создания (должно быть ровно 334 символа, ни больше, ни меньше).Я смог создать все, кроме трейлера.Особенность в том, что трейлер должен содержать до количества строк.

Я настроил свой маленький инструмент следующим образом:

//loop to cat all 20 files (remove header and trailer)
//generate header from date 
//execute wc -l on generated file and add +1 (bc trailer is missing)
//append trailer with executed  wc -l information in it

Я пробовал несколько команд, чтобы добавить +1 к своему трейлеру, но ни одна из них не работала должным образом:

Это то, что я до сих пор работал:

lineCount=echo more someFile.dat | wc -l
echo $lineCount
//echo "$((lineCount + 1))" -> 1
//echo "$(($lineCount + 1))" -> 1
//let "lineCount+=1" -> 1
//$lineCount=lineCount+1 -> won't work
//$lineCount=$lineCount+1 -> won't work
//x=$lineCount+1 -> won't work

Это был вывод echo $lineCount (без каких-либо изменений или чего-либо еще), перед числом

* 1013, кажется, есть два пустых пространства*

Какова моя цель, чтобы вместо 163108 число было 163109

edit:

мои входные файлы выглядят примерно так:

HFFP20190         *
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX                      YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ                            ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD
TFFP2019000031795 *

тогда как HFFP - это заголовок, а TFFP - это трейлер -> главное различие между заголовком и трейлером - это последний номер (31795), который содержит количество строк в файле.Вывод после этого слияния должен выглядеть примерно так:

HFFP20190         *
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX                      YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ                            ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX                      YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ                            ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXX                      YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ABCDEFGHIJKLMNOPQWERSTUVWXYZ                            ASDFASDFASDFASDFASDFASDFASDFASDFASDFASD

...
TFFP2019000163109 *

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

Потому что

lineCount=echo

назначает переменную строку "echo".В полном объеме

lineCount=echo more someFile.dat | wc -l

запускает команду

more someFile.dat | wc -l

с выводом на стандартный вывод, а не на вашу переменную, в то время как временно назначает lineCount="echo" только дляпродолжительность этой единственной команды.

Для записи синтаксис для захвата стандартного вывода в переменную составляет

lineCount=$(wc -l <someFile.dat)

, где я выделил бесполезные more и еще более бесполезныеecho.

В целом, гораздо лучшее решение, вероятно, состоит в том, чтобы преобразовать все это в скрипт Awk.Вы не описали логику верхнего и нижнего колонтитула достаточно подробно, но что-то вроде

awk '
    # Skip first line in all files except the first
    FNR==1 && NR>1 { next }
    # Print and increment, excluding trailer
    !/^TFFP/ { print; c++ }
    # Add back last trailer
    END { sub(/000[1-9][0-9]*$/, "000" 1+c); print} ' someFiles*

Подстановочный знак someFiles* необходимо будет заменить чем-то, что фактически соответствует вашим входным файлам в правильном порядке;возможно *.dat?

0 голосов
/ 19 сентября 2019

Вы можете попробовать это:

# get only the lines from wc command
lineCount=$(wc -l someFile.dat | cut -d' ' -f1)

# add 1
((lineCount++))

echo "$lineCount"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...