wc -l file.txt
genera il numero di righe e il nome del file.
Mi serve solo il numero stesso (non il nome del file).
posso farlo
wc -l file.txt | awk '{print $1}'
Ma forse c'è un modo migliore?
wc -l file.txt
genera il numero di righe e il nome del file.
Mi serve solo il numero stesso (non il nome del file).
posso farlo
wc -l file.txt | awk '{print $1}'
Ma forse c'è un modo migliore?
Risposte:
Prova in questo modo:
wc -l < file.txt
wc -l
non dovrebbe emetterne uno, e perché ksh dovrebbe anteporre l'output standard di un programma con uno spazio?
4711 [stdin]
all'output.
printf "%'d"
, che si occupa dello spazio e stampa in modo corretto grandi numeri.
cat file.txt | wc -l
Secondo la pagina man (per la versione BSD, non ho una versione GNU da controllare):
Se non viene specificato alcun file, viene utilizzato l'input standard e non viene visualizzato alcun nome file. Il prompt accetterà l'input fino alla ricezione di EOF o [^ D] nella maggior parte degli ambienti.
wc -l < file.txt
ha lo stesso effetto.
wc -l < file.txt
per evitare l'uso inutile di cat. Anche se sei assolutamente pazzo se pensi che ciò stia consumando tempo notevole.
Per fare questo senza lo spazio iniziale, perché no:
wc -l < file.txt | bc
wc -l < file.txt
per correggere l'errore di analisi e rimuovere lo spazio:wc -l < file.txt | bc
Che ne dite di
wc -l file.txt | cut -d' ' -f1
cioè reindirizza l'output di wc
in cut
(dove i delimitatori sono spazi e seleziona solo il primo campo)
wc -l file.txt | awk '{print $1}'
provato dall'OP.
wc -l < file.txt
metodo. Ma deve essere utilizzato | cut -d' ' -f2
su BSD, purché il wc
comando restituisca uno spazio iniziale, ad esempio: "34068289 file.txt" anziché "34068289 file.txt".
Ho avuto un problema simile nel tentativo di ottenere un conteggio dei personaggi senza lo spazio bianco iniziale fornito da wc
, che mi ha portato a questa pagina. Dopo aver provato le risposte qui, i seguenti sono i risultati dei miei test personali su Mac (BSD Bash). Ancora una volta, questo è per il conteggio dei personaggi; per il conteggio delle righe che faresti wc -l
. echo -n
omette l'interruzione della riga finale.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
Non mi affiderei al cut -f*
metodo in generale poiché richiede che tu conosca il numero esatto di spazi iniziali che può avere un determinato output. E grep
quello funziona per contare le linee, ma non i caratteri.
bc
è il più conciso awk
e perl
sembra un po 'eccessivo, ma dovrebbero essere tutti relativamente veloci e portatili.
Si noti inoltre che alcuni di questi possono essere adattati per tagliare anche gli spazi bianchi circostanti dalle stringhe generali (insieme a echo `echo $FOO`
un altro trucco accurato).
echo $(printf '%s' "$FOO" | wc -c)
è una delle rare occasioni in cui echo
con un comando la sottoscrizione non è inutile.
echo `echo $FOO`;
agisce anche come un comando String.trim () su una variabile! È incredibilmente utile. Aggiungerò anche la tua linea alla mia risposta.
Ovviamente, ci sono molte soluzioni a questo. Eccone un altro però:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Questo produce solo il numero di righe, ma \n
è presente il carattere di nuova riga finale ( ), se non lo si desidera, sostituirlo [:blank:]
con [:space:]
.
test9
con 1 riga, l'output sarà 19.
Il modo migliore sarebbe innanzitutto trovare tutti i file nella directory, quindi utilizzare AWK NR (Variabile numero di record)
sotto è il comando:
find <directory path> -type f | awk 'END{print NR}'
esempio : - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
fa il lavoro in modo preciso e conciso.