попробуйте использовать
String="${39}+${41}+${43}+${45}+${47}+${49}+${51}+${53}"
,который дает
set $(seq 101 200)
String="${39}+${41}+${43}+${45}+${47}+${49}+${51}+${53}"
echo $String
139+141+143+145+147+149+151+153
edit:
если вам нужна строка, не используйте двойную кавычку
string='$39+$41+$43+$45+$47+$49+$51+$53'
echo $string
'$39+$41+$43+$45+$47+$49+$51+$53'
element
не является переменной awk
.
Чтобы импортировать значение переменной оболочки в скрипт awk
, вы можете использовать
awk -v variable="$value" '{ script goes here }'
В приведенном выше примере переменная с именем variable
получит значение переменной оболочки с именем value
. Вы должны использовать variable
в скрипте awk
без префикса $
.
Обратите внимание, что если вы ставите перед переменной префикс $
в awk
, предполагается, что значение переменной является положительным целым числом и ссылается на определенное поле в текущей входной записи. Выражение $element
, например, даст вам значение номера поляelement
(так же, как $1
даст вам значение первого поля, а $NF
даст вам значение последнего поля, где NF
встроенная переменная, обозначающая количество полей в текущей записи ).
Если element
не установлен в коде awk
, $element
будет расширен до $0
, что является полной строкой. Затем ваш код напечатал бы всю строку, если бы его первое поле с разделителями табуляции -было единственным в строке.
Ваш скрипт awk
можно также сократить до
awk -F '\t' -v e="$element" '$1 == e'
Или вы можете заменить все это на
arr_country=(AL AD AM AT BY BE BA BG CH)
( IFS='|'; grep -E "^(${arr_country[*]})\>" ) <abc.txt >xyz.txt
или,
grep -E '^(AL|AD|AM|AT|BY|BE|BA|BG|CH)\>' <abc.txt >xyz.txt
Подстановка параметра ${arr_country[*]}
расширится до одной строки, состоящей из значений вашего массива, разделенных первым символом $IFS
. Это создает регулярное выражение, идентичное второму grep
, показанному выше. \>
будет соответствовать пробелу с нулевой шириной -в конце слова (, так что ^AA\>
соответствует AA
в начале строки, но неAAA
).
Единственное отличие состоит в том, что результат может быть упорядочен по-другому по сравнению с решением с циклом оболочки с awk
.
Другой подход к устранению цикла оболочки (, предполагающий значение по умолчанию$IFS
):
arr_country=(AL AD AM AT BY BE BA BG CH)
awk -v c="${arr_country[*]}" -F '\t' '
BEGIN { n=split(c,a," "); for (i=1;i<=n;++i) country[a[i]] }
$1 in country' <abc.txt >xyz.txt
Здесь,мы передаем элементы arr_country
в виде строки, разделенной пробелом -, для кода awk
в переменной c
. Прежде чем начать чтение из ввода, строка c
разбивается на части, и каждая часть превращается в ключ в ассоциативном массиве country
. Если первое поле является ключом в этом массиве, печатается строка.