Ho questo codice in uno script di shell:
sort input | uniq -c | sort -nr > output
Il file di input non aveva spazi bianchi precedenti, ma l'output sì. Come posso risolvere questo problema? Questo è in bash
Ho questo codice in uno script di shell:
sort input | uniq -c | sort -nr > output
Il file di input non aveva spazi bianchi precedenti, ma l'output sì. Come posso risolvere questo problema? Questo è in bash
Risposte:
Il comportamento predefinito di uniq è giustificare a destra la frequenza in una riga di 7 spazi, quindi separare la frequenza dall'elemento con un singolo spazio.
Fonte: https://www.thelinuxrain.com/articles/tweaking-uniq-c
Rimuovi gli spazi iniziali con sed:
$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
perl -pe 's/ *(\d+) /$1\t/'
( qui alcune alternative ). Effettua inoltre il pipe negli Appunti xclip -selection c
per incollarlo direttamente in un foglio di calcolo.
FWIW è possibile utilizzare uno strumento di ordinamento diverso per una maggiore flessibilità. Python è uno di questi strumenti.
#!/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)
In teoria, questo sarebbe persino più veloce dello sort
strumento per input di grandi dimensioni poiché il programma precedente utilizza una tabella hash per identificare linee duplicate anziché un elenco ordinato. (Purtroppo pone le linee di conteggio identico in un ordine arbitrario anziché naturale; questo può essere modificato ed essere ancora più veloce di due sort
invocazioni.)
Se si desidera una maggiore flessibilità del formato di output è possibile esaminare la print()
e format()
funzioni built-in.
Ad esempio, se si desidera stampare il numero di conteggio in ottale con un massimo di 7 zeri iniziali e seguito da una scheda anziché da uno spazio con un carattere di riga NUL, sostituire l'ultima riga con:
print(format(count, '08o'), item, sep='\t', end='\0')
Memorizza lo script in un file, diciamo sort_count.py
, e invocalo con Python:
python3 sort_count.py < input
uniq -c -i | tr -s ' ' | cut -c 2-
Converti gli spazi bianchi principali in un unico spazio bianco con tr -s e quindi stampa l'output dal 2 ° carattere con cut -c.