2010-08-03 13 views
16

Mam linie danych, które zawierają pojedynczej kolumny i dwie kolumny. Co chcę zrobić, to wyodrębnić linie, które zawierają tylko 2 kolumny.Filtrowanie wierszy na podstawie liczby kolumn z AWK

0333 foo 
bar 
23243 qux 

uzyskując tylko:

0333 foo 
23243 qux 

Należy pamiętać, że są one oddzielone zakładka, nawet w przypadku linii z tylko jedną kolumnę masz kartę na początku.

Jak to zrobić?

próbowałem tego, ale nie:

awk '$1!="";{print $1 "\t" $2}' myfile.txt 

enter code here 

Odpowiedz

23

Musisz użyć NF (liczba pól) zmiennej kontrolować działania, takie jak na poniższym transkryptu:

$ echo '0333 foo 
> bar 
> 23243 qux' | awk 'NF==2{print}{}' 
0333 foo 
23243 qux 

Będzie wydrukuj linię, jeśli liczba pól wynosi dwa, w przeciwnym razie nic nie da. Powodem, dla którego mam (na pozór) dziwną konstrukcję, jest to, że niektóre implementacje awk będą drukowane domyślnie, jeśli nie zostaną dopasowane żadne reguły dla linii. Puste polecenie {} gwarantuje, że tak się nie stanie.

Jeśli masz szczęście wystarczy, aby jeden z tych, które tego nie zrobi, można uciec z:

awk 'NF==2' 

ale pierwsze rozwiązanie powyżej będzie działać w obu przypadkach.

+0

Dlaczego nie 'awk 'NF == 2 {print} {} {} {} {} {} {}'' ?? NF == 2 wystarcza. –

+2

@Mark, niektóre implementacje 'awk' będą drukowane domyślnie, jeśli nie określisz domyślnej akcji. Mój kod działa również na te. Wasze ciała są zepsute waszym awk GNU, niektórzy z nas muszą napisać przenośny kod :-) Ja wyjaśnię. – paxdiablo

+0

@ pax, Implementacja awk, która zachowuje się tak, jak opisujesz, byłaby bardzo zepsuta. Z tego co mi wiadomo, awk pochodzi z wersji 7, a instrukcja wyraźnie opisuje jego zachowanie: "na przykład, długość programu> 72 drukuje wszystkie linie wejściowe, których długość przekracza 72 znaki." –

Powiązane problemy