ฉันมีรหัสนี้ในเชลล์สคริปต์:
sort input | uniq -c | sort -nr > output
ไฟล์อินพุตไม่มี white space ก่อนหน้านี้ แต่เอาต์พุตจะทำ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร นี่คือทุบตี
ฉันมีรหัสนี้ในเชลล์สคริปต์:
sort input | uniq -c | sort -nr > output
ไฟล์อินพุตไม่มี white space ก่อนหน้านี้ แต่เอาต์พุตจะทำ ฉันจะแก้ไขสิ่งนี้ได้อย่างไร นี่คือทุบตี
คำตอบ:
พฤติกรรมเริ่มต้นของuniqคือปรับความถี่ในช่องว่างกว้าง 7 บรรทัดจากนั้นแยกความถี่ออกจากรายการด้วยช่องว่างเดียว
ที่มา: https://www.thelinuxrain.com/articles/tweaking-uniq-c
ลบช่องว่างนำด้วย sed:
$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
perl -pe 's/ *(\d+) /$1\t/'
( ที่นี่มีตัวเลือกอื่น ๆ ) ไปป์ไปยังคลิปบอร์ดด้วยxclip -selection c
เพื่อวางโดยตรงไปยังสเปรดชีต
uniq -c
เพิ่มช่องว่างชั้นนำ เช่น
$ echo test
test
$ echo test | uniq -c
1 test
คุณสามารถเพิ่มคำสั่งที่ส่วนท้ายของไปป์ไลน์เพื่อลบออก เช่น
$ echo test | uniq -c | sed 's/^\s*//'
1 test
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
uniq -c -i | tr -s ' ' | cut -c 2-
แปลช่องว่างนำหน้าไปไว้ในช่องว่างเดียวด้วย tr -s แล้วพิมพ์เอาต์พุตจากอักขระที่สองด้วยการตัด -c