Имеется одна строка ввода с аргументами 'n', разделенными пробелом.Сами входные аргументы являются переменными.Ввод осуществляется через внешний файл.
Я хочу переместить определенные элементы в переменные в зависимости от регулярных выражений.Поэтому я думал сначала объявить переменную-указатель, чтобы отслеживать, где я нахожусь.Кроме того, присвоение переменной не зависит от числового порядка, и в зависимости от ввода некоторые переменные могут быть полностью пропущены.
Мой текущий метод заключается в использовании awk '{print $1}' file.txt
Однако не все элементы являются фиксированными, и мне нужноучитывать элементы, которые могут отсутствовать или иметь несколько записей.
ОБНОВЛЕНИЕ: я нашел другой метод.
file=$(cat /file.txt)
for i in ${file[@]}; do
echo $i >> split.txt;
done
Таким образом, вместо одной строки с несколькими аргументами, мы получаем несколько строк с одним аргументом.таким образом, теперь мы можем использовать var#=(grep --regexp="[pattern]" split.txt
.Теперь мне просто нужно выяснить, как лучше использовать регулярные выражения для фильтрации этого беспорядка.
Позвольте мне привести пример.
Мои входные строки:
RON KKND 1534Z AUTO 253985G 034SRT 134OVC 04/32
RON KKND 5256Z 143623G72K 034OVC 074OVC 134SRT 145PRT 13/00
RON KKND 2234Z CON 342523G CLS 01/M12 RMK
Таким образом, присваивание переменной для каждого из вышеперечисленных будет:
var1=RON var2=KKND var3=1534Z var4=TRUE var5=FALSE var6=253985G varC=2 varC1=034SRT varC2=134OVC var7=04/32
var1=RON var2=KKND var3=5256Z var4=FALSE var5=FALSE var6=143623G72K varC=4 varC1=034OVC varC2=074OVC varC3=134SRT varC4=145PRT var7=13/00
var1=RON var2=KKND var3=2234Z var4=FALSE var5=TRUE var6=342523G varC=0 var7=01/M12
Таким образом, четвертый аргумент может быть var4, var5 или var6.Пятый аргумент может быть var5, var6 или соответствовать другому критерию.Шестой аргумент может быть или не быть var6.Между var6 и var7 можно определить, сопоставив каждый аргумент с */*
Сведение этого еще больше, Позиции на входе var1, var2 и var3 фиксированы, но после этого мне нужно сравнить, упорядочить,и назначить.Кроме того, сами аргументы могут различаться по длине символа.Относительная позиция каждой секции, которая будет разделена, фиксирована относительно ее соседей.Например, var7 никогда не будет перед var6 во входных данных, и если var4 и var5 имеют значение true, то 4-й и 5-й аргументы всегда будут «AUTO CON». Некоторые сегменты всегда будут одним аргументом, а другие - более одного.Относительная позиция каждого известна.Что касается каждого шаблона, некоторые из них имеют определенный символ в определенном месте, а другие могут не иметь никакого флага относительно того, что он находится в стороне от своей позиции в последовательности.
Поэтому мне нужен awk для распознавания переменной указателя каккаждый аргумент должен проверяться, пока не будет найдено конкретное совпадение
#Check to see if var4 or var5 exists. if so, flag and increment pointer
pointer=4
if (awk '{print $$pointer}' file.txt) == "AUTO" ; then
var4="TRUE"
pointer=$pointer+1
else
var4="FALSE"
fi
if (awk '{print $$pointer}' file.txt) == "CON" ; then
var5="TRUE"
pointer=$pointer+1
else
var5="FALSE"
fi
#position of var6 is fixed once var4 and var5 are determined
var6=$(awk '{print $$pointer}' file.txt)
pointer=$pointer+1
#Count the arguments between var6 and var7 (there may be up to ten)
#and separate each to decode later. varC[0-9] is always three upcase
# letters followed by three numbers. Use this counter later when decoding.
varC=0
until (awk '{print $$pointer}' file.txt) == "*/*" ; do
varC($varC+1)=(awk '{print $$pointer}' file.txt)
varC=$varC+1
pointer=$pointer+1
done
#position of var7 is fixed after all arguments of varC are handled
var7=$(awk '{print $$pointer}' file.txt)
pointer=$pointer+1
Я знаю, что приведенный выше синтаксис неверен.Вопрос в том, как это исправить.
var7 не всегда в конце строки ввода.Аргументы после var7, однако, не нужно обрабатывать.
На самом деле интерпретирую шаблоны, к которым я еще не дошел.Я намерен справиться с этим, используя операторы case, сравнивая переменные с регулярными выражениями для сравнения.Я не хочу использовать awk для прямой интерпретации паттернов, так как это может стать очень грязным.Я обдумывал использование for n in $string
, но сделать это означало бы сравнение каждого аргумента с каждой возможной комбинацией напрямую (и есть несколько сегментов с несколькими шаблонами), и это нецелесообразно.Я пытаюсь сделать это двухэтапным процессом.