Фильтрация набора данных с помощью AWK на основе списка

попробуйте использовать

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'
1
08.10.2018, 16:19
1 ответ

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. Если первое поле является ключом в этом массиве, печатается строка.

2
27.01.2020, 23:42

Теги

Похожие вопросы