2012-03-04 11 views
9

Mam napisać skrypt, który zawiera kilka linii awk

linia awk wygląda tak:

cat input.csv | awk -F, '$1~/$1/ {print "is good"}' 

pierwszy $1 to pierwsza kolumna CSV wejście, drugi $1 ma być pierwsze wejście linii poleceń tego skryptu powłoki

próbowałem umieścić \ przed drugim $, ale wydaje się być nie działa.

Czy ktoś może pomóc?

Odpowiedz

5
cat input.csv | awk -F, '$1~/'"$1"'/ {print "is good"}' 

Trzeba zamknąć ciąg ' wstawić muszlę $1 (wewnątrz " w przypadku istnieją znaki specjalne), a następnie ponownie otworzyć ciąg '.

A może chcesz sprawdzić, czy $1 z powłoki zawiera / znaków, które będą zaburzyć wyrażenie regularne.

I jak @Ignacio Vazquez-Abrams wskazał, nie trzeba potrącić wyjścia cat do awk, można po prostu uzyskać awk, aby przeczytać plik bezpośrednio. Czyli:

cat input.csv | awk ... 

można uprościć do:

awk ... < input.csv 
+1

To właściwie nie mówi awk, aby odczytać plik. Mówi, aby powłoka przekazała ją bezpośrednio do stdin awk zamiast użyć kota. –

+0

@Ignacio Vazquez-Abrams: Wiem, ale nie chciałem się zbytnio komplikować. –

+0

@ IgnacioVazquez-Abrams Przekierowanie nie "wprowadza go bezpośrednio do standardowego wejścia awk". Plik * staje się stdin * awk. Bezużyteczne użycie kota zasila zawartość pliku w standardowe wejście awk, a to, że bezużyteczne I/O powoduje, że UUOC jest nieefektywne. –

4

zmienna też jest w porządku.

awk -F, -v needle="$1" '$1 ~ needle {print "is good"}' < input.csv 
+0

Dobry pomysł na dodatkową zmienną. Myślę, że eliminuje to problem, w którym '$ 1' może zawierać znaki specjalne, prawda? –

+5

Każda postać jest wyjątkowa na swój sposób. –

1

Kot lub przekierowanie nie jest potrzebne. Oto trzeci wariant wykorzystujący ukośnik odwrotny:

awk -F, "\$1~/$1/ {print \"is good\"}" input.csv 
Powiązane problemy