2014-09-20 7 views
8

Muszę sprawdzić, czy plik ma więcej niż 1 linię. Próbowałem tego:Jak sprawdzić, czy plik ma więcej niż 1 linię w warstwie BASH?

if [ `wc -l file.txt` -ge "2" ] 
then 
    echo "This has more than 1 line." 
fi 


if [ `wc -l file.txt` >= 2 ] 
then 
    echo "This has more than 1 line." 
fi 

Te właśnie zgłaszają błędy. Jak mogę sprawdzić, czy plik ma więcej niż 1 linię warunkową BASH?

Odpowiedz

18

Polecenie:

wc -l file.txt 

wygeneruje wyjście jak:

42 file.txt 

z wc usłużnie informacją, nazwę pliku, jak również. Czyni to w przypadku jesteś sprawdzanie wiele plików na raz i chcesz indywidualne jak również całkowity Statystyki:

pax> wc -l *.txt 
973 list_of_people_i_must_kill_if_i_find_out_i_have_cancer.txt 
    2 major_acheivements_of_my_life.txt 
975 total 

można zatrzymać wc ze robi to poprzez zapewnienie jego dane dotyczące standardowego wejścia, więc nie robi „t wiedzieć nazwę pliku:

if [[ $(wc -l <file.txt) -ge 2 ]] 

Poniższy zapis pokazuje to w akcji:

pax> wc -l qq.c 
26 qq.c 

pax> wc -l <qq.c 
26 

Na marginesie zauważysz, że przełączyłem się również na używanie [[ ]] i $().

Preferuję ten pierwszy, ponieważ ma mniej problemów ze względu na zgodność wsteczną (głównie z dzieleniem ciągu), a drugi, ponieważ znacznie łatwiej jest zagnieździć pliki wykonywalne.

2
if [ `wc -l file.txt | awk '{print $1}'` -ge "2" ] 
... 

Powinieneś zawsze sprawdzić, co zwraca każda podkomenda. Komenda wc -l file.txt powraca wyjście w następującym formacie:

12 file.txt 

Trzeba pierwszą kolumnę - można wyodrębnić go z awk lub cut lub innego narzędzia do wyboru.

5

Czysty bash (≥4) możliwość korzystania mapfile:

#!/bin/bash 

mapfile -n 2 < file.txt 
if ((${#MAPFILE[@]}>1)); then 
    echo "This file has more than 1 line." 
fi 

The mapfile wbudowanych sklepów, co czyta z stdin w tablicy (MAPFILE domyślnie), jedna linia na polu. Użycie -n 2 powoduje, że odczytuje co najwyżej dwie linie (dla wydajności). Następnie wystarczy sprawdzić, czy tablica MAPFILE ma więcej niż jedno pole. Ta metoda jest bardzo wydajna.

Jako produkt uboczny, pierwsza linia pliku jest przechowywana w ${MAPFILE[0]}, w razie potrzeby. Przekonasz się, że znak końca nowej linii nie jest przycięty.Jeśli trzeba zdjąć tylną znak nowej linii, należy wybrać opcję -t:

mapfile -t -n 2 < file.txt 
4

Jak o:

if read -r && read -r 
then 
    echo "This has more than 1 line." 
fi < file.txt 

jest potrzebne, aby zapewnić -r flag znaki kontynuacja wiersza nie spasować dwie linie w jednym , które spowodowałyby, że poniższy plik zgłosiłby tylko jedną linię:

This is a file with _two_ lines, \ 
    but will be seen as one. 
+0

+1 Najprostsza odpowiedź. – chepner

+0

@paxdiablo Masz rację. Dzięki. Można debatować, czy dwie linie, w których pierwsza kończy się odwrotnym ukośnikiem, powinny być traktowane jako jedna linia, ponieważ powinna to być określona przez aplikację. Ale ponieważ 'wc -l 'ignoruje odwrotny ukośnik, powinno to być również zignorowane. – Scrutinizer

Powiązane problemy