Использование Variable Int в качестве позиционного аргумента [$($var) вместо $6]

На самом деле вы можете сделать это с помощьюsed(и другого инструмента для сопоставления с первым файлом ). Например:

$ sed -E "s/(WGHT\s*).*/\1$(grep -oP 'Recommended Weight: \K[0-9.]+' fileA)/" fileB 
asdajskdha
kjashdjahsd
WGHT 0.546

Или просто сначала сохраните его в переменной:

$ wght=$(sed -En 's/Recommended Weight: *([0-9.]+)/\1/p' fileA)
$ sed -E "s/(WGHT\s*).*/\1$wght/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546 
0
04.10.2019, 17:59
2 ответа

Чтобы оставить ответ для будущих искателей. Предоставлено pLumo и другими комментаторами.

awk и bash по-разному обрабатывают '$'. Вы можете использоватьawk -v $var1=$input

-v используется для создания переменных. $var1 — это имя переменной awk. $input — это имя переменной bash. Как упоминает Исаак, они могут даже иметь одинаковые имена

.
0
28.01.2020, 03:13

Обратите внимание, что символ $имеет разные эффекты и значения для оболочки (, например. bash )и для awk.

В оболочке ${name}вводится расширение переменной, и когда эта переменная является целым числом, доступ к переменной представляет собой список аргументов оболочки . В оболочке (bash )самым большим аргументом (без{…})является $9, но с {…}нет (установленного )предела, пока новые запросы памяти предоставляется.

В awk$является оператором доступа к полям строки ввода. Существует жесткое ограничение в 32767 возможных полей в mawk :

.
$ echo $(seq 80000) | mawk '{print $(32767+2)}'
mawk: program limit exceeded: maximum number of fields size=32767

Но не в GNU awk:

$ echo $(seq 80000) | awk '{print $(32767+2)}'
32769

В awkоператор$мог повторяться (как !(, а некоторые другие )могли):

$ awk 'BEGIN{var=111;print( !!!!!!var )}'
1

$ echo 23 {a..z} | awk '{field=1;print( $$field )}'
v

Это ближе к тому, что вам нужно?

awk 'NR == FNR {a[$1 FS $2] = $3; next} 
     $$indexa FS $$indexb in a {$$indexa = a[$$indexa FS $$indexb]}
    ' filea indexa=16 indexb=25 fileb
0
28.01.2020, 03:13

Теги

Похожие вопросы