Если файл, который вы читаете, никогда не может быть пользовательским, вы можете злоупотребить встроенной программой read:
f=file.tsv
read $(head -n1 "$f") extra <<<`seq 100`
awk "{print \$$id, \$$age}" "$f"
Вся первая строка входного файла подставляется в список аргументов, поэтому read
передаются все имена полей из строки заголовка в качестве имен переменных. Первой из них присваивается 1, которую генерирует seq 100
, второй - 2, третьей - 3 и так далее. Избыточный выход seq
поглощается фиктивной переменной extra
. Если вы заранее знаете количество входных столбцов, вы можете изменить 100 на соответствующее и избавиться от extra
.
Сценарий awk
представляет собой строку с двойными кавычками, что позволяет подставлять в сценарий переменные оболочки, определенные read
, в виде номеров полей awk
.
Если дата всегда предоставляется в этом формате :'2019 -05 -03', это, вероятно, будет работать всегда:
#!/bin/sh -
if [ -n "$2" ] && [ "$(date -d "$2" +%Y-%m-%d 2> /dev/null)" = "$2" ]; then
echo 'This date is valid'
fi