Вы не можете установить переменную в несколько значений ни в одном известном мне обычном языке программирования, но вы, безусловно, можете зациклиться на наборе значений с помощью переменной.
Создайте цикл оболочки вокруг кода awk
, который выполняется для каждого значения x
:
for x in 0 1; do
printf 'Running with x=%d\n' "$x"
awk -v x="$x" \
'$1 == "x" { $1 = x }
$2 == "x" { $2 = x }
$1 == $2 { printf("match on line %d: %d == %d\n", NR, $1, $2) }' file.in
done
Код awk
проверяет два столбца на наличие символа x
и (, если оно истинно )устанавливает его равным текущему значению переменной awk
x
(, которая устанавливается в командной строке ).
Если позже столбцы совпадают, создается некоторый вывод.
При заданных данных получается результат
Running with x=0
match on line 1: 0 == 0
match on line 3: 1 == 1
Running with x=1
match on line 2: 1 == 1
match on line 3: 1 == 1
В качестве альтернативы можно переместить цикл в awk
(, что намного эффективнее, так как оболочке не нужно запускаться awk
более одного раза):
awk -v x="$x" \
'{ for (x=0; x<=1; ++x) {
printf("x is %d\n", x);
if ($1 == "x") { a = x } else { a = $1 }
if ($2 == "x") { b = x } else { b = $2 }
if (a == b) { printf("match on line %d: %d == %d\n", NR, a, b) }
}
}' file.in
Выход:
x is 0
match on line 1: 0 == 0
x is 1
x is 0
x is 1
match on line 2: 1 == 1
x is 0
match on line 3: 1 == 1
x is 1
match on line 3: 1 == 1
Попробуйте:
$ awk -F"|" 'NR==1 {for(i=1;i<=NF;i++) if ($i=="S1" || $i=="S2" || $i=="D1" ) {print i}}' demo.txt
Однако (Я только что проверил ),Ответ @guruделает то же самое и, с моей точки зрения, на него приятнее смотреть.