Предполагая, что ваше требование состоит в том, чтобы сопоставить номер столбца, содержащий test
, и выполнить над ним некоторые операции, выполнить простой цикл по столбцам до NF
и сопоставить с помощью оператора сопоставления регулярного выражения ~
или для фиксированных строк выполнить равенство соответствует как $i == "test"
awk '
{
for(i=1;i<=NF;i++) {
if ($i ~ "test") {
halfLength=(length($i)/2)
$i=(substr($i,1,halfLength) "SOMETHING" substr($i,(halfLength+1),halfLength))
}
}
}1' <<<"This is a test"
Выдает ожидаемый результат. Обратите внимание, что я сделал вызов substr()
для печати второй части строки как substr($i,(halfLength+1),halfLength)
. Требуется +1
, который вы пропустили раньше. Я использовал результат substr()
для изменения номера столбца, содержащего test
, то есть как $i=..
.
Кроме того, при выполнении {..}1
каждое из полей столбца реконструируется на основе изменений, если таковые имеются, в нашем случае только для столбца, содержащего нужную строку.
Также обратите внимание, что вся попытка завершится неудачей, если целевая строка содержит нечетное количество символов или образует подстроку другой строки большего размера (можно использовать оператор равенства, но подход с регулярным выражением не удастся)
это не удастся, если целевая строка состоит из нечетного числа символов (например,
tests
) и когда целевое слово является частью другого слова (например,contestant
).@EdMorton: Конечно, Эд! Знал это, просто хотел исправить попытку ОП. Добавлю примечание о случаях, которые вы упомянули.
@EdMorton: Готово, Эд! Теперь они перескочат прямо к вам, увидев мой ответ;)