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 -lnon 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.txtha lo stesso effetto.
wc -l < file.txtper 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.txtper 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 wcin 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.txtmetodo. Ma deve essere utilizzato | cut -d' ' -f2su BSD, purché il wccomando 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 -nomette 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 grepquello funziona per contare le linee, ma non i caratteri.
bcè il più conciso awke perlsembra 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 echocon 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:].
test9con 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.txtfa il lavoro in modo preciso e conciso.