วิธีการแยกเขตข้อมูลด้วยช่องว่างหรือแท็บใน awk


51

ในขณะที่เล่นกับawkฉันมาเพื่อรัน:

ls -la >> a.txt ; awk {'print $5  $1'} a.txt ;

นี่คือการให้ผลลัพธ์เช่น:

53277-rw-------
52347-rw-------

ฉันจะหาช่องว่างระหว่างเพื่อนสองคนของเอาท์พุตได้อย่างไร


1
lsในฐานะที่เป็นคำแนะนำที่คุณไม่ควรแยกการส่งออกของ สิ่งนี้จะกัดคุณในด้านหลังไม่ช้าก็เร็ว
gniourf_gniourf

ใน awk เพื่อเชื่อมสองสายเข้าด้วยกันคุณเพียงแค่วางมันไว้ข้างๆprint $5 $1
glenn jackman


2
@kenorb และผู้มีสิทธิเลือกตั้งอย่างใกล้ชิดความซ้ำซ้อนที่เชื่อมโยงไม่ซ้ำกันเลย พวกเขารู้วิธีพิมพ์ฟิลด์โดยใช้หลักฐาน ( awk {'print $5 $1'} a.txt) แล้ว พวกเขากำลังถามถึงวิธีการเว้นวรรคระหว่างฟิลด์ # 1 และฟิลด์ # 5
kos

คำตอบ:


72

เพียงแค่เปลี่ยนสายเป็น

ls -la >> a.txt ; awk {'print $5 "        " $1'} a.txt ;

ควรพิมพ์ผลลัพธ์ด้วยช่องว่าง

หวังว่านี่จะช่วยได้

แก้ไข:

ตามที่แนะนำโดยMcNisseคุณสามารถใช้ printf ซึ่งจะให้รูปแบบผลลัพธ์ที่ดี

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;

4
printfฟังก์ชั่นให้การควบคุมที่ดีขึ้นโดยเฉพาะถ้าคุณต้องการรูปแบบตัวเลข printf("%s\t%s\n", $5, $1)
McNisse

มีการพิมพ์ผิดในคำตอบข้างต้น? สิ่งที่ไม่5sหมายถึงในawk {'printf ("%5s\t%s\n", $5, $1)'}
วิษณุ

66

อีกเทคนิคที่เฉพาะเจาะจง awk ใช้ "แยกเขตเอาท์พุท"

ls -la | awk -v OFS='\t' '{print $5, $1}'

เครื่องหมายจุลภาคมีความสำคัญที่นี่


งานนี้ แต่ทำให้$1ไปขึ้นบรรทัดใหม่
loretoparisi


5

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่ฉันเพิ่งเรียนรู้และพบว่าโพสต์เหล่านี้มีประโยชน์ ทางออกที่ดีที่สุดของฉันคือการใช้เพ่งพิศเพื่อแทรกช่องว่างระหว่างตัวแปรสำหรับคุณ

ls -la | gawk '{print $1, $9}'

3
-1: ไม่มีอะไรใหม่ gawk, mawkหรืออื่น ๆ ที่awkพวกเขาทั้งหมดช่องว่างแทรกถ้าคุณใช้เครื่องหมายจุลภาคซึ่งเป็นสิ่งที่คำตอบนี้กล่าวว่า
muru

1
ls -la | awk '{print $1, $9}'ควรจะเป็น อย่างที่ muru กล่าวว่าgawkไม่จำเป็น
Nick Crawford

1

ที่จะวางช่องว่างระหว่างข้อโต้แย้งเพียงเพิ่มเช่น" "awk {'print $5" "$1'}

อย่างไรก็ตามไม่แนะนำให้แยกวิเคราะห์เอาต์พุตของlsคำสั่งเนื่องจากไม่น่าเชื่อถือและเอาต์พุตสำหรับมนุษย์ไม่ใช่สคริปต์ ดังนั้นจึงใช้คำสั่งทางเลือกเช่นหรือfindstat

นี่คือตัวอย่างการใช้ GNU stat:

$ stat -t *
001.txt 23 8 81a4 501 20 1000004 242236402 1 0 0 1460260387 1460260239 1460260239 1460260194 4096
7c1c.txt 21 8 81a4 501 20 1000004 242236595 1 0 0 1460261322 1460260486 1460260486 1460260486 4096

ซึ่งจะพิมพ์ผลลัพธ์ที่เป็นมิตรกับเครื่องจักรของคุณ (ในรูปแบบสั้น) ดังนั้นคุณสามารถได้รับสิ่งที่คุณต้องการ จากนั้นใช้-cการใช้รูปแบบที่เฉพาะเจาะจงหรือใช้awk, cutหรือreadจะได้รับคอลัมน์ทางด้านขวา

ตรวจสอบstat --helpตัวเลือกเพิ่มเติม ตัวอย่างเช่นพิมพ์วันที่แก้ไขให้ตรวจสอบตัวอย่างนี้

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