ใช้ตัวแปรในฟังก์ชั่นย่อย awk


1

ทั้งหมดฉันมีสตริงที่ฉันต้องการแยกสตริงย่อย สิ่งคือตำแหน่งเริ่มต้นจะถูกเก็บไว้ในตัวแปร AWK ดูเหมือนจะไม่รู้จักตัวแปร

นี่คือรหัส

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)}'

แต่มันไม่ได้ผล บีบบังคับ awk วิธีการรับรู้i?

คำตอบ:



1

awkตัวแปรไม่ได้ถูกส่งผ่านไป แทน

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

ทำ

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

อย่างไรก็ตามผลลัพธ์คือ

% ./a.sh
is is a test

ผลลัพธ์ที่คุณต้องการคืออะไร?


ฉันต้องการผลลัพธ์ที่จะ "คือการทดสอบ"
smokinguns

1

ทำไมไม่ประมวลผลทั้งหมดในการเรียกใช้ 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)
}

หากคุณต้องการเชลล์สคริปต์ของคุณเพื่อดูค่าของiคุณสามารถเพิ่ม> "/dev/tty"ที่ส่วนท้ายของprintคำสั่งด้านบนจากนั้นเพิ่มอีกบรรทัดหนึ่งโดยบอกว่าprint iไม่มีการเปลี่ยนเส้นทางจากนั้นใส่printf ... | awk ...บรรทัดทั้งหมดในi=$(...)โครงสร้าง


0

คำตอบโดยตรงกับคำถามเดิม: โดยการหลีกเลี่ยงเครื่องหมายคำพูดและปล่อยให้เชลล์ขยายตัวแปร:

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

หากสงสัยว่าตัวแปรอาจมีพื้นที่ว่างและสิ่งอื่น ๆ และต้องการให้ถือว่าเป็นสตริงใน awk เราสามารถใช้เครื่องหมายคำพูดเพิ่มเติมได้:

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

... แต่สิ่งหนึ่งมักจะทำบางสิ่งบางอย่างน้อยกว่าความเหมาะสมที่สุดถ้าพูดถึงเรื่องนี้ :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.