สคริปต์ Awk ไม่พบสัญลักษณ์แฮช“ #”

Sep 11 2020

ฉันจะทำให้ awk ละเว้นบันทึกที่เริ่มต้นด้วยความคิดเห็นในขณะที่เก็บบันทึกอื่น ๆ ทั้งหมดได้อย่างไร สคริปต์ awk ด้านล่างไม่ละเว้นระเบียนที่ขึ้นต้นด้วยสัญลักษณ์แฮชในไฟล์ทดสอบตัวอย่างนี้ นอกจากนี้ยังข้ามการnumpyบันทึก

ไฟล์ทดสอบ
# Version numbers have been retrieved from a range of machines and environments.
# Take them with a grain of salt.

# Direct dependencies
#python==3.6.0
#pip==9.0.1
#setuptools==38.2.4  # old for MarkupSafe 1.0 (28.8.0 is installed with py 3.6)
numpy==1.12.1  # 1.12.0
pandas==0.19.2
สคริปต์ Awk
#! /usr/bin/awk -f

BEGIN { 
  regex=/^[a-zA-Z]+\S+/ 
  n=0
}

$1 ~ regex {print $1; n++};

END{
  {print "\n# \n# End proccessing of "FILENAME" \n# Original file had "NR" records\n# Current file record count is "n};
  { if(NR>=n) print "#\n# Mattached all records"};
}
เอาต์พุต (ไม่สนใจแถบ)
|| #python==3.6.0
|| #pip==9.0.1
|| pandas==0.19.2
|| 
|| # 
|| # End proccessing of requirements.txt 
|| # Original file had 9 records
|| # Current file record count is 3
|| #
|| # Mattached all records

คำตอบ

2 EdMorton Sep 11 2020 at 07:49

regex=/^[a-zA-Z]+\S+/หมายถึง "เปรียบเทียบ$0การ/^[a-zA-Z]+\S+/และบันทึกผลในตัวแปรregex" เพื่อที่regexจะเป็น 1 หรือ 0 เป็นผลจากการที่ได้รับมอบหมายที่และเนื่องจากเราอยู่ในBEGINส่วนที่ไม่มีเส้นได้รับการอ่านและอื่น ๆ $ 0 regex=0ยังคงว่างเปล่าก็เทียบเท่ากับ

\Sเป็นส่วนขยาย GNU awk ซึ่งหมายความว่า[^[:space:]]ดังนั้นหากคุณใช้ GNU awk - มันยังรองรับค่าคงที่ regexp ที่พิมพ์ไว้อย่างมาก (ดูhttps://www.gnu.org/software/gawk/manual/gawk.html#Strong-Regexp-Constants). ด้วยเหตุนี้คุณสามารถทำได้ (สังเกต@สัญลักษณ์):

$ seq 5 | awk 'BEGIN{re=@/3/} $0 ~ re'
3

แต่ใน GNU awk เท่านั้น

ในตัวแปร awk อื่น ๆ (ซึ่งหากคุณบอกว่าคุณกำลังใช้เวอร์ชัน20070501ฉันสงสัยว่าคุณกำลังใช้ตัวแปร BSD) สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือใช้ regexp แบบไดนามิก:

$ seq 5 | awk 'BEGIN{re="3"} $0 ~ re'
3
1 ThomasDickey Sep 11 2020 at 05:30

นั่นไม่ใช่รูปแบบ awk (ดูเหมือน perl):

regex=/^[a-zA-Z]+\S+/ 

สิ่งนี้จะใช้งานได้:

regex="^[a-zA-Z]+[^[:space:]]+"

นอกจากนี้รูปแบบของคุณควรตรงกับ$0(ไม่$1) $0คือเส้นทั้งหมด $1เป็นฟิลด์แรก (คิดว่าเป็นคำแรกในแต่ละบรรทัดซึ่งอาจไม่มีการ#จับคู่ในคอลัมน์แรก)

ด้วยการแก้ไขสองข้อนี้ตัวอย่างของคุณใช้ได้กับฉัน ...