Это (несколько сложное) решение, которое несколько похоже на ответ Жиля,
- не выводит пробел в начале строки,
- правильно обрабатывает случай, когда строка ввода начинается с пробела, и
- сохраняет пробелы между полями.
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")