Используйте awk для вывода наибольшего буквенно-цифрового результата grep и создания следующей переменной в последовательности - PullRequest
0 голосов
/ 01 июля 2018

У меня есть исходный файл со следующей информацией.

WABEL8499IPM101
WABEL8499IPM102
WABEL8499IPM103
WABEL8499IPM104
WABEL8499IPM105
WABEL8499IPM106
WABEL8499IPM107
WABEL8499IPM108

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

Используйте grep для поиска файла WABEL8499IPM, который показывает все вышеперечисленные результаты. Мне нужно найти WABEL8499IPM108, потому что он самый большой в последовательности, а затем создать новую переменную (сколько зависит от того, что вводит пользователь) со значением WABEL8499IPM109. Если пользователь вводит количество 2, тогда мне нужно и 109, и 110. Моя цель - создать скрипт bash для ввода базового имени (без последних 3 цифр), найти наибольшее в последовательности и затем вывести в файл журнала Следующие имена в последовательности, сколько раз пользователю нужно.

Я не совсем уверен, с чего начать. Я могу найти все, используя grep, но не могу найти только самое большое значение / последовательность. Пользователь будет вводить только базовое имя, потому что он не будет знать последние 3 цифры. В настоящее время у меня нет кода, который работает.

SRCFILE="~/Desktop/deviceinfo.csv"  
LOGDIR="~/Desktop/"  
LOGFILE="$LOGDIR/DeviceNames.csv"  

echo -e "\n"  
echo "What is the base device name?"  
read deviceName  
echo "How many device names do you need?"  
read quantityName  
lines=$(grep -c "$deviceName" $SRCFILE)  
echo -e "\n"  
echo "There are $lines results."  
deviceResults=$(grep -F "$deviceName" $SRCFILE)  
echo -e "\n"  
echo Device Name\'s Currently Enrolled:  
echo "$deviceResults"  
echo -e "\n" 
echo "Your output file has been created."
CODE FOR CREATING OUTPUT FILE HERE
echo "$deviceName1" >> "$LOGFILE"  
echo "$deviceName2" >> "$LOGFILE"  
echo "$deviceName3" >> "$LOGFILE"

Можно ли с помощью этого метода использовать справочный файл для ввода? Например, если бы мне пришлось исследовать и создать несколько имен с разными количествами, могли бы мы использовать для этого входной справочный файл, чтобы нам не приходилось вводить их по отдельности и запускать сценарий несколько раз?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

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

logdir="~/Desktop/"  
srcfile="$logdir/deviceinfo.csv"  
logfile="$logdir/DeviceNames.csv"  

echo
read -p "What is the base device name? " deviceName
echo
read -p "How many device names do you need? " quantityName
echo

awk -v name="$deviceName" \
  -v q="$quantityName" \
  -v lelog="$logfile" '
  $0 ~ "^"name {
    sub(name,"")
    a=a>$0?a:$0
    }
  END {
    if ( a )
        for ( i = 1 ; i <= q ; i++ )
            print name ( a + i ) >> lelog
    }
' "$srcfile"
0 голосов
/ 01 июля 2018
SRCFILE="~/Desktop/deviceinfo.csv"  
LOGDIR="~/Desktop/"  
LOGFILE="$LOGDIR/DeviceNames.csv"  

# base name, such as "WABEL8499IPM"
device_name=$1
# quantity, such as "2"
quantityNum=$2

# the largest in sequence, such as "WABEL8499IPM108"
max_sequence_name=$(cat $SRCFILE | grep -o -e "$device_name[0-9]*" | sort --reverse | head -n 1)

# extract the last 3digit number (such as "108") from max_sequence_name
max_sequence_num=$(echo $max_sequence_name | rev | cut -c 1-3 | rev)

# creat a sequence of files starting from "WABEL8499IPM101"  if there is not any "WABEL8499IPM". 
if [ -z "$max_sequence_name" ];
then    
    max_sequence_name=device_name
    max_sequence_num=100
fi

# create new sequence_name
# such as ["WABEL8499IPM109", "WABEL8499IPM110"]
array_new_sequence_name=()
for i in $(seq 1 $quantityNum);
do
    cnum=$((max_sequence_num + i))
    array_new_sequence_name+=($(echo $device_name$cnum))
done

#CODE FOR CREATING OUTPUT FILE HERE
#for fn in ${array_new_sequence_name[@]}; do touch $fn; done;

# write log
for sqn in ${array_new_sequence_name[@]};
do
    echo $sqn >> $LOGFILE
done

Использование:

bash test.sh WABEL8499IPM 2

Результат в файле журнала:

WABEL8499IPM109
WABEL8499IPM110

EDITED

Входной справочный файл (input.txt):

WABEL8499IPM,2
WABEL8555IPM,6
WABEL8444IPM,5

Сценарий оболочки драйвера:

INPFIL="./input.txt"
PSRC="./test.sh"    

cat $INPFIL | while read line; 
do
    device_name=`echo $line | cut -d "," -f 1`
    quantity_num=`echo $line | cut -d "," -f 2`
    bash $PSRC $device_name $quantity_num
done;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...