Perché il comando uniq -c ha messo all'inizio uno spazio bianco?


11

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:


13

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

2
7 spazi, alias "poco meno di una scheda".
Chrylis

È quindi possibile separare con le schede con qualcosa di simile perl -pe 's/ *(\d+) /$1\t/'( qui alcune alternative ). Effettua inoltre il pipe negli Appunti xclip -selection cper incollarlo direttamente in un foglio di calcolo.
Pablo Bianchi,

5

uniq -caggiunge spazi bianchi principali. Per esempio

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

È possibile aggiungere un comando alla fine della pipeline per rimuoverlo. Per esempio

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

1

FWIW è possibile utilizzare uno strumento di ordinamento diverso per una maggiore flessibilità. Python è uno di questi strumenti.

fonte

#!/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 sortstrumento 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 sortinvocazioni.)

Formato di output

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')

uso

Memorizza lo script in un file, diciamo sort_count.py, e invocalo con Python:

python3 sort_count.py < input

0
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.


La tua soluzione comprime tutte le occorrenze della sequenza degli spazi bianchi. Questo è l'effetto desiderato.
Marc Vanhoomissen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.