2013-08-14 11 views
5

il file a.txt ha due righe vuote alla fineCome mantenere righe vuote alla fine di un file quando comando cat utente che ho in script di shell

[[email protected] tmp]$ cat -n a.txt 
    1 jhasdfj 
    2 
    3 sdfjalskdf 
    4 
    5 

e il mio script è:

[[email protected] tmp]$ cat t.sh 
#!/bin/sh 
a=`cat a.txt` 
a_length=`echo "$a" | awk 'END {print NR}'` 
echo "$a" 
echo $a_length 


[[email protected] tmp]$ sh t.sh 
jhasdfj 

sdfjalskdf 
3 

aperta di debug

[[email protected] tmp]$ sh -x t.sh 
++ cat a.txt 
+ a='jhasdfj 

sdfjalskdf' 
++ echo 'jhasdfj 

sdfjalskdf' 
++ awk 'END {print NR}' 
+ a_length=3 
+ echo 'jhasdfj 

sdfjalskdf' 
jhasdfj 

sdfjalskdf 
+ echo 3 
3 

il comando cat rubare le righe vuote alla fine del file.How per risolvere questo problema.

risposta

1

Non hai bisogno di comando cat qui, utilizzare direttamente awk in questo modo:

awk 'END {print NR}' a.txt 

Il tuo problema è nella memorizzazione di uscita del gatto in una variabile di shell. Anche questo darà Uscita destra (se caso di UUOC):

cat a.txt | awk 'END {print NR}' 

Aggiornamento: Quando si tenta di fare questo:

a=`cat a.txt` 

Oppure:

a=$(cat a.txt) 

La trappola è che la sostituzione del processo , ad es. Il comando all'interno della virgola inversa come hai o in $() strisce che scorrono a fine riga.

Si può fare questo trucco per ottenere ritorni a capo memorizzati in una variabile di shell finale:

a=`cat a.txt; echo ';'` 
a="${a%;}" 

test il valore della variabile:

echo "$a" 
printf "%q" "$a" 

Poi uscita mostrerà nuove righe così:

jhasdfj 

sdfjalskdf 


$'jhasdfj\n\nsdfjalskdf\n\n\n' 
3

Il comando cat non ruba nulla È la sostituzione di comando che fa. man bash dice:

Bash effettua l'espansione eseguendo il comando e rimpiazzando la sostituzione di comando con lo standard output del comando, con ogni newline finale cancellate. a capo incorporati non vengono eliminati

Se si desidera memorizzare un output di un comando a una variabile, si potrebbe aggiungere && echo . dopo il comando, memorizzare l'output e rimuovere la finale ..

Inoltre, per contare il numero di linee in un file, il modo cannonical è quello di eseguire wc -l:

wc -l < a.txt 
Problemi correlati