พิมพ์คอลัมน์ใน awk ตามชื่อส่วนหัว


12

ฉันมีไฟล์ข้อความเช่นนั้น

foo bar baz
1   a   alpha
2   b   beta
3   c   gamma

ฉันสามารถใช้ awk พิมพ์คอลัมน์บางอย่างเช่น 1 และ 3 ด้วยแต่ผมต้องการระบุคอลัมน์ที่จะพิมพ์โดยการระบุส่วนหัวของคอลัมน์แทนสิ่งที่ชอบ{print $1, $3} {print $foo, $baz}สิ่งนี้มีประโยชน์ดังนั้นฉันจึงไม่ต้องเปิดไฟล์และนับคอลัมน์ด้วยตนเองเพื่อดูว่าคอลัมน์ใดอยู่และฉันไม่จำเป็นต้องอัปเดตสคริปต์หากหมายเลขคอลัมน์หรือคำสั่งซื้อเปลี่ยนแปลง ฉันสามารถทำสิ่งนี้ด้วย awk (หรือเครื่องมือเชลล์อื่น) ได้หรือไม่

คำตอบ:


17
awk '
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{ print $(f["foo"]), $(f["baz"]) }
' file
foo baz
1 alpha
2 beta
3 gamma

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


ขอบคุณมากและทำงานเพื่อจุดประสงค์ของฉัน คุณสามารถอธิบายได้ว่าวิธีนี้ใช้ได้กับมือใหม่หรือไม่? อะไรคือไวยากรณ์ของ f [$ i] ที่ทำในสิ่งนี้และ awk ทำงานอย่างไรในคอลัมน์ที่ตรงกับสตริง?
AlexLipp

ไม่เป็นไร นั่นคือไวยากรณ์ awk พื้นฐานอย่างแน่นอนเพียงแค่ค้นหาฟิลด์และอาร์เรย์ในหน้าเว็บ awk (หรือ google it) เพิ่มprint iและprint $iและprint f [$ i] `คำสั่งในลูป ฯลฯ เพื่อติดตามสิ่งที่เกิดขึ้นหากสิ่งนั้นช่วยได้
เอ็ดมอร์ตัน

1

คุณขอawkแต่คุณยังสามารถใช้เครื่องมือพิเศษอื่น ๆ csvtoolอีกมากมายสำหรับการนี้:

csvtool -t ' ' -u ' ' namedcol foo,baz file

หรือ

csvtool -t ' ' -u ' ' col 1,3 file

1

สมมติว่าไฟล์ดังกล่าวเป็นไฟล์ TSV ("ค่าที่คั่นด้วยแท็บ") โดยใช้csvkit:

$ csvcut -t -c foo,baz file.tsv
foo,baz
1,alpha
2,beta
3,gamma

เอาต์พุตจะได้รับการจัดรูปแบบ CSV อย่างเหมาะสม แต่สามารถเปลี่ยนกลับเป็น TSV ได้อย่างง่ายดาย:

$ csvcut -t -c foo,baz file.tsv | csvformat -T
foo     baz
1       alpha
2       beta
3       gamma

-cตัวเลือกที่จะcsvcutยังสามารถใช้ตัวเลขและช่วงและยังสามารถใช้ในการจัดเรียงคอลัมน์ของข้อมูลการป้อนข้อมูล (คุณลักษณะที่ฉันมักจะพลาดในมาตรฐานcutยูทิลิตี้)

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