Как использовать переменную в выражении awk - PullRequest
3 голосов
/ 08 апреля 2010

Я пытаюсь сделать эту команду:

sed bla bla filename | awk '{printf "%s %s_entry_%.3f %.3f %.3f %.3f",$1,$3,$4,$5,$6,$7}'

Но дело в том, что я хочу, чтобы часть% .3f была переменной.Таким образом, в одном случае это может быть% .3f, а в другом -% .3f% .3f% .3f.Так что для ясности я просто буду использовать статический в своем примере кода.Так что, если я хочу 4 из этих% .3f и поместить их в переменные $, например, так:

values="%.3f %.3f %.3f %.3f"

Тогда как я могу поместить эту строку в выражение awk, не заставляя awk просто вставить буквально{значения} "там.Вот моя неработающая попытка:

sed bla bla filename | awk '{printf "%s %s_entry_${values}",$1,$3,$4,$5,$6,$7}'

Ответы [ 3 ]

7 голосов
/ 08 апреля 2010

вы можете использовать -v параметр awk для передачи переменной из оболочки

#!/bin/bash    
awk -v values="${values}" '{gsub("blah","replace");printf "%s %s_entry_"values ....}' file

функция gsub() состоит в том, чтобы заменить то, что у вас есть, этой командой sed. Так что подойдет только одна команда awk. sed избыточен в этом случае (и в большинстве других случаев, когда используется awk)

2 голосов
/ 08 апреля 2010

Простые в использовании фактические переменные awk:

sed bla bla filename | awk -v values="$values" '{printf "%s %s_entry_"values,$1,$3,$4,$5,$6,$7}'

Или с bash:

awk -v values="$values" '{printf "%s %s_entry_"values,$1,$3,$4,$5,$6,$7}' <(sed bla bla filename)
1 голос
/ 08 апреля 2010

Если вы имеете в виду, что values является переменной оболочки, то это будет работать:

sed bla bla filename | awk '{printf "%s %s_entry_"ENVIRON["values"],$1,$3,$4,$5,$6,$7}'
...