Это (несколько сложное) решение, которое несколько похоже на ответ Жиля,
- не выводит пробел в начале строки,
- правильно обрабатывает случай, когда строка ввода начинается с пробела, и
- сохраняет пробелы между полями.
awk -v word=alpha '
$2 == word {
i = index($0, $1) # Find $1 within $0 (the line).
if (i > 0) { # Sanity check; should always be true.
i = i + length($1) # Find space after $1.
temp = substr($0, i)
i = index(temp, $2) # Find $2 in remainder of line.
if (i > 0) { # Sanity check; should always be true.
print substr(temp, i)
}
}
}'
Я считаю, что комментарии в строке объясняют это довольно хорошо.
Мы находим позицию $1
в строке (помните, я явно не предполагаю, что это в начале).
Затем, в ответ на вопрос Жиля, мы убираем $1
(и пробел перед ним, если есть) с линии.
Затем найдите позицию $2
в оставшейся части строки и удалите пробелы перед этим.
Вот небольшое упорядочение ответа Денниса Уильямсона.
awk -v word=alpha '$2==word { for (f=2; f<=NF; ++f) printf("%s%s", $f, (f==NF?ORS:OFS)) }'
Как и ответ Денниса, он выводит поля $2
, $3
,…, $NF
(без учета $1
) с разделением по умолчанию.
Деннис использовал приближение $3
,…, $NF
(но не $2
) с разделителем полей вывода по умолчанию.
Я выбрал следующий метод $2
, $3
,…, $(NF-1)
(но не $NF
) с OFS. И, так как $NF
следует выходной разделитель записей (ПРС), мы можем ?:
оператор без нулевых терминов, и устранить окончательный printf("\n")