ทำไมคำสั่ง uniq -c วางช่องว่างไว้ที่จุดเริ่มต้น


11

ฉันมีรหัสนี้ในเชลล์สคริปต์:

sort input | uniq -c | sort -nr > output

ไฟล์อินพุตไม่มี white space ก่อนหน้านี้ แต่เอาต์พุตจะทำ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร นี่คือทุบตี

คำตอบ:


13

พฤติกรรมเริ่มต้นของuniqคือปรับความถี่ในช่องว่างกว้าง 7 บรรทัดจากนั้นแยกความถี่ออกจากรายการด้วยช่องว่างเดียว

ที่มา: https://www.thelinuxrain.com/articles/tweaking-uniq-c

ลบช่องว่างนำด้วย sed:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output

2
7 ช่องว่างหรือที่รู้จักกันว่า "น้อยกว่าแท็บ"
chrylis -on strike-

จากนั้นคุณสามารถแยกด้วยแท็บที่มีลักษณะคล้าย ๆ กันperl -pe 's/ *(\d+) /$1\t/'( ที่นี่มีตัวเลือกอื่น ๆ ) ไปป์ไปยังคลิปบอร์ดด้วยxclip -selection cเพื่อวางโดยตรงไปยังสเปรดชีต
Pablo Bianchi

5

uniq -cเพิ่มช่องว่างชั้นนำ เช่น

$ echo test
test
$ echo test | uniq -c
      1 test

คุณสามารถเพิ่มคำสั่งที่ส่วนท้ายของไปป์ไลน์เพื่อลบออก เช่น

$ echo test | uniq -c | sed 's/^\s*//'
1 test

1

FWIW คุณสามารถใช้เครื่องมือคัดแยกที่แตกต่างกันเพื่อความยืดหยุ่นที่มากขึ้น Python เป็นหนึ่งในเครื่องมือดังกล่าว

แหล่ง

#!/usr/bin/python3
import sys, operator, collections

counter = collections.Counter(map(operator.methodcaller('rstrip', '\n'), sys.stdin))
for item, count in counter.most_common():
    print(count, item)

ในทางทฤษฎีสิ่งนี้จะยิ่งเร็วกว่าsortเครื่องมือสำหรับอินพุตขนาดใหญ่เนื่องจากโปรแกรมข้างต้นใช้ตารางแฮชเพื่อระบุบรรทัดที่ซ้ำกันแทนที่จะเป็นรายการที่เรียงลำดับ (อนิจจามันวางบรรทัดที่มีจำนวนที่เท่ากันโดยพลการแทนคำสั่งตามธรรมชาติซึ่งสามารถแก้ไขได้และยังเร็วกว่าsortการเรียกใช้สองครั้ง)

รูปแบบผลลัพธ์

หากคุณต้องการความยืดหยุ่นมากขึ้นในรูปแบบผลลัพธ์คุณสามารถดูprint()และformat()ฟังก์ชั่นในตัว

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

    print(format(count, '08o'), item, sep='\t', end='\0')

การใช้

จัดเก็บสคริปต์ในไฟล์พูดsort_count.pyและเรียกใช้ด้วย Python:

python3 sort_count.py < input

0
uniq -c -i | tr -s ' ' | cut -c 2-

แปลช่องว่างนำหน้าไปไว้ในช่องว่างเดียวด้วย tr -s แล้วพิมพ์เอาต์พุตจากอักขระที่สองด้วยการตัด -c


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