Gunakan variabel dalam fungsi subk


1

Semua, saya punya string dari mana saya ingin mengekstraksi substring. Masalahnya adalah bahwa posisi awal disimpan dalam variabel. AWK Sepertinya tidak mengenali variabel.

Ini kodenya

str="This is a test"  
s1="is"  
i=$(awk -v a="$str" -v b="$s1" 'BEGIN{print index(a,b)}')  
echo "$str" | awk '{print substr($0,$i)}'

Tetapi ini tidak berhasil. Bagaimana memaksa awk untuk mengenali i?

Jawaban:



1

Variabel tidak diteruskan awk. Dari pada

echo "$str" | awk '{print substr($0,$i)}'

melakukan

echo $str | awk -v i="$i" '{print substr($0,i)}'

Namun, hasilnya adalah

% ./a.sh
is is a test

Apa output yang Anda inginkan?


Saya ingin hasilnya menjadi "adalah ujian"
smokinguns

1

Mengapa tidak melakukan semua proses dalam satu permintaan awk?

haystack="This is a test"
needle="is"
printf '%s\n' "$haystack" | awk -v "needle=$needle" '{\
    i=index($0, needle)
    if (i) print substr($0, i)
}

Jika Anda membutuhkan skrip shell Anda untuk juga melihat nilai i, Anda bisa menambahkan > "/dev/tty"ke akhir printperintah di atas, lalu menambahkan baris lain yang mengatakan hanya print itanpa redirect, kemudian bungkus seluruh printf ... | awk ...baris dalam sebuah i=$(...)konstruk.


0

Jawaban langsung ke pertanyaan awal: dengan menghindari tanda kutip dan membiarkan shell memperluas variabel:

awk '{print substr($0,'$i')}'

Jika diduga bahwa variabel tersebut mungkin berisi ruang kosong dan hal-hal lain dan seseorang ingin itu diperlakukan sebagai string dalam awk, seseorang hanya dapat menggunakan lebih banyak tanda kutip:

awk '{print index($0,"'"$s1"'")}'

... tapi seseorang sering melakukan sesuatu yang kurang optimal jika sampai pada ini :-).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.