Awk: สคริปต์บนเส้นทาง?

Sep 18 2020

มีวิธีใส่awkscriptoids เล็ก ๆ น้อย ๆบนเส้นทางหรือไม่?

ตัวอย่างเช่นฉันมีการดำเนินการจัดเรียงที่มีประโยชน์มาก:

// collate-csv.awk
FNR > 1 || NR == 1

และฉันสามารถใช้มันได้หลายวิธี:

xargs -a $(find * -name *.csv) awk -F',' -f collate-csv.awk | ...

ปัญหาเดียวคือฉันไม่มีวิธีเรียกเครื่องมือ awk จากที่ใดก็ได้ ด้วยเชลล์สคริปต์ที่เรียกใช้งานได้ฉันสามารถวางลงในโฟลเดอร์ bin บนเส้นทาง มีกลไกใน linux ที่ฉันสามารถทำให้ไฟล์awkต้นฉบับที่ไม่สามารถเรียกใช้งานได้จากทุกที่ที่ฉันไปในระบบไฟล์หรือไม่

(ด้วยคุณสมบัติที่ว่า "กลไก" ไม่ใช่ "ทำไมคุณไม่ตีด้วยค้อน" - สไตล์ kludge)

คำตอบ

5 Archemar Sep 18 2020 at 21:26

นอกจากคำตอบของ @ Roamia แล้วคุณยังสามารถใช้AWKPATHตัวแปรสำหรับรายการไดเร็กทอรีที่จะค้นหาcollate-csv.awk

AWKPATH=${HOME}/include/awk:/some/other/path export AWKPATH xargs -a $(find * -name *.csv) awk -f collate-csv.awk -F',' | ...

โปรดทราบ

  • .awk การขยายไม่บังคับเพียง แต่ต้องสอดคล้องกัน
  • บรรทัด shebang เช่น#!/usr/bin/awk -fจำเป็นเมื่อใช้สคริปต์แบบสแตนด์อโลนเป็นสคริปต์ (ไม่มีการawk -fโทร)
  • คุณจะต้องใช้awk -f(และ awk รู้วิธีใช้AWKPATHbash don't)
3 roaima Sep 18 2020 at 20:46

สร้างawkสคริปต์ปฏิบัติการและเพิ่มลงในไฟล์$PATH

mkdir -p "$HOME/bin"
cat >"$HOME/bin/collate-csv <<'x' #!/usr/bin/awk -f # # collate-csv.awk # NR == 1 { print } FNR == 1 { next } {print} x chmod a+x "$HOME/bin/collate-csv"
export PATH="$PATH:$HOME/bin"

ตอนนี้คุณสามารถใช้collate-csvเช่นเดียวกับที่คุณใช้คำสั่งอื่น ๆ

xargs -a $(find * -name *.csv) collate-csv -F',' | ...