ตัดคอลัมน์ 2 จากไฟล์ข้อความ


15

ไฟล์ข้อความของฉันไม่มีตัวคั่นเพื่อระบุช่องว่างตัวคั่นฉันจะตัดคอลัมน์ 2 ไปยังไฟล์เอาต์พุตได้อย่างไร

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

เอาท์พุทที่ฉันต้องการคือ

207
412
432

คำตอบ:


13

มันเป็นวิธีที่ง่ายที่สุดในการจัดการawkช่องว่างที่ต่อเนื่องหลาย ๆ อันในช่องเดียว

awk '{print $2}' file

พิมพ์

207
412
431

แต่เห็นได้ชัดว่ามีเครื่องมืออื่น ๆ อีกมากมายที่จะทำงานแม้ว่าจะไม่ได้ออกแบบมาสำหรับงานเช่นgrep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

ใช้ไพพ์เพื่อส่งข้อมูลของคุณ (เช่น cat columns.txt) ไปยัง cut

cat columns.txt | cut -d" " -f5

ในข้อมูลตัวอย่างที่คุณให้ไว้ตัวคั่นช่องว่างเดียวจะใส่ข้อมูลที่คุณต้องการในฟิลด์ 5 ในการส่งเอาต์พุตนั้นไปยังไฟล์อื่นใช้การเปลี่ยนเส้นทาง

cat collumns.txt | cut -d" " -f5 > field2.txt

การใช้คำสั่ง awk คุณสามารถทำสิ่งต่าง ๆ เช่นด้านล่างซึ่งรับรู้โดยอัตโนมัติในฟิลด์ที่คุณอยู่หลังจากนั้นเนื่องจากมีข้อมูลอยู่ที่นั่น (?) ฉันต้องเรียนรู้เพิ่มเติมเกี่ยวกับ awk

awk -F' ' '{print $2}' columns.txt

3
การลงมือcat ... |มักไม่ค่อยจำเป็น คำสั่งยูนิกซ์ส่วนใหญ่ชอบใช้เวลาหนึ่งหรือไฟล์ข้อมูลเพิ่มเติมเป็นข้อโต้แย้งเช่นcut cut -d" " -f5 columns.txt
เดนิสฮาว

1

@jimmij กล่าวว่าawk '{print $2}' fileเป็นคำตอบที่ง่ายที่สุด

หากด้วยเหตุผลบางอย่างคุณไม่ต้องการใช้awkและยืนยันในการใช้cutคุณสามารถใช้sedแปลงทุกอินสแตนซ์ของช่องว่างสองช่องขึ้นไปให้เป็นแท็บเดียว ( cutตัวคั่นเริ่มต้นของ) ก่อนที่จะตัดเป็นส่วน ๆ

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

คุณยังสามารถใช้ช่องว่างเดียวเป็นตัวคั่นคุณจะมีคอลัมน์เพิ่มขึ้น เพิ่มค่าที่คุณให้cut -d' ' -fจาก 2 ถึง 5 หรืออาจ 6 เพิ่มจำนวนจนกว่าคุณจะได้ผลลัพธ์ที่ต้องการ


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

ด้านบนมีประโยชน์มากเมื่อยูทิลิตี้ Linux อย่าง awk สำหรับการดึงข้อมูลไม่ทำงานหากคุณเปลี่ยนเป็นผู้ใช้ "root" ภายในเชลล์สคริปต์เช่นด้านล่าง:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF

1
เหตุผลเดียวที่ " awkไม่ทำงาน" ในตัวอย่างของคุณก็คือเอกสารที่นี่ไม่มีการอ้างอิงหมายความว่า$2เชลล์จะขยายไปยังพารามิเตอร์ตำแหน่งที่สอง การแก้ปัญหาอาจจะไม่เปลี่ยนไปใช้grepคำสั่ง แต่อย่างใดอย่างหนึ่งหลบหนี$ใน$2ขณะที่\$2หรือเพียงแค่พูดเอกสารทั้งหมดโดยใช้ในสถานที่ของ<<'EOF' <<EOFนอกจากนี้โปรดทราบว่างานในตัวอย่างของคุณนั้นง่ายpgrepกว่า
Kusalananda

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