วิธีการวาดเส้นแบ่งที่มีชื่อเรื่องก่อนที่จะแสดงผล


0

ฉันได้เขียนสคริปต์ที่แสดงชื่อและแผนกของผู้ใช้และใช้งานได้นอกจากนี้ฉันพยายามวาดเส้นแบ่งที่มีการตั้งชื่อให้กับคอลัมน์ตามที่พวกเขาต้องการ ฉันพยายามทำกับ printf แต่อย่างใดไม่สามารถรับได้ ณ ตอนนี้ .. ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม ..

ด้านล่างนี้เป็นสคริปต์และผลลัพธ์ที่คาดหวัง ..

#!/bin/sh
for names in `cat namefile`;

do

DATA1="`/grid/common/bin/cod -u $names | awk -F: '/Department/ {print $2}'`"
DATA2="`/grid/common/bin/cod -u $names | awk -F: '/Name/ {print $2}'`"

#printf '%*s\n' "${COLUMN'S:-$(tput cols)}" '' | tr ' ' -
printf "%-50s : %10s\n" "$DATA2" "$DATA1"
done
bash-4.1$ sh Userdetail.sh
        Karn Kumar                                 :   TT, Infra, VM & India
        Manas .                                    :   TT, Infra, VM & India
        Pranjal Agrawal                            :   TT, Infra, VM & India
        Rogen Mana                                 :   PP OPS-Brazil

ฉันกำลังพยายามหาวิธีวาดเส้นกับชื่อก่อนที่ผลลัพธ์จะแสดงตามที่คาดไว้ด้านล่าง:

  Name                                         Department

--------------------------------------------------

Karn Kumar                                 :   TT, Infra, VM & India
Manas .                                    :   TT, Infra, VM & India
Pranjal Agrawal                            :   TT, Infra, VM & India
Rogen Mana                                 :   PP OPS-Brazil

สำหรับวิธีการเพิ่มเติมในส่วนคำสั่ง ..

bash-4.1$ /grid/common/bin/cod -u karn
        Name:        Karn Kumar
        Title:       IT -Staff Systems Engineer

        Department:  TT, Infra, VM & India
        Mgr:         KK LIN
        Mgr Login:   ttlin
        E-Mail:      karn@abc.com
        Phone:       09999999999
        Internal #:  
        Ext:         4848
        Cell:        8777880559
        Fax:            -
        Building:    NOIDA 03
        Floor:       03
        Room:        3.3.109

นอกจากนี้ความคิดเห็นด้านข้าง: โปรดหลีกเลี่ยงการใช้ backtick เพื่อทดแทนการใช้คำสั่ง$( command )แทน มันทำให้อ่านง่ายขึ้นและหลีกเลี่ยงปัญหาบางอย่าง for variable in $(cat file.txt)นอกจากนี้ยังไม่ได้ใช้ มีวิธีอื่นที่ดีกว่าในการอ่านไฟล์ทีละบรรทัด ดูmywiki.wooledge.org/BashFAQ/001
Sergiy Kolodyazhnyy

คำตอบ:


2

คุณมีprintf "%-50s : %10s\n" "$DATA2" "$DATA1"ซึ่งบอกฉันทั้งหมดคุณจะมีเส้นกว้าง 63 ตัวอักษร (รวมถึงช่องว่างและ:) ดังนั้นเราจะต้องการprintf "%63s"สตริง วิธีง่ายๆคือการพิมพ์ที่ว่างแล้วแปลงให้เป็น-อย่างนั้น

printf "%60s" " " | tr ' ' '-' 

แน่นอนเราสามารถใช้วิธีการที่เรียบง่ายbashแต่มันเป็นเฉพาะกับ อย่างไรก็ตามเราสามารถปรับเปลี่ยนได้เล็กน้อย:

printf "=%.0s"  $(seq 1 63)

สิ่งนี้จะทำงานในเชลล์และระบบที่seqติดตั้งไว้

ดังนั้นให้พิมพ์ส่วนหัวก่อนเข้าไปในลูป ตัวอย่างเช่นนี่เป็นกรณีที่ง่ายมาก:

$ cat ./print_header.sh                                                                                           
#!/bin/bash
# print header
printf "%-50s : %10s\n" "Name"  "Department"
# print separator
printf "=%.0s"  $(seq 1 63)
# insert a newline
printf "\n"
# and this is where your for loop would begin.
# just for the sake of example, there's only one line
printf "%-50s : %10s\n" "John Doe"  "IT,Infra"
$ ./print_header.sh                                                                                               
Name                                               : Department
===============================================================
John Doe                                           :   IT,Infra

ขอบคุณสำหรับเคล็ดลับ แต่จะทำอย่างไรให้พอดีกับผลลัพธ์ที่คาดหวัง
krock1516

เมื่อใช้สิ่งนี้มันจะเพิ่มบรรทัด "-" ก่อนที่ทุกเอาต์พุตจะแสดง
krock1516

@Karn ฉันจะเพิ่มตัวอย่างง่ายๆ ฉันไม่มีไฟล์อินพุตที่คุณใช้ดังนั้นฉันจะทำบางอย่างให้เสร็จ
Sergiy Kolodyazhnyy

1
@Karn ตอบแก้ไข
Sergiy Kolodyazhnyy

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