2012-02-28 14 views
8

Mam plik, który wygląda tak:Dlaczego awk nie drukuje nowych linii?

1 
2 
AA 
4 
5 
AA BB 
7 
8 
AA BB CC 
10 
11 
AA BB CC DD 

Używam awk wyodrębnić tylko co nth linię gdzie n=3.

>>awk 'NR%3==0' /input/file_foo >> output/file_foobar 

Wyjście pojawia się w jednej linii jak:

AA AA BB AA BB CC AA BB CC DD 

..... i tak dalej

chcę pojawiać się jako:

AA 
AA BB 
AA BB CC 
AA BB CC DD 

Próbowałem używać \n, printf z \n i tak dalej, ale nie działa tak, jak oczekuję. Proszę doradź.

+2

Którą powłokę używasz? Jest to zwykły monit, który nie wskazuje typu powłoki. W jaki sposób wykazujesz, że dane są płaskie w jednej linii? –

+1

Czy próbowałeś zmienić zmienną RS? –

+0

Dzięki. Używałem Cygwina, ale terminator linii nie był właściwy, jak wspomniał Shiplu. – mane

Odpowiedz

8

rozwlekły sposób

awk '{ if (NR%3==0) { print $0} }' 

Również można użyć {printf("%s\n\n", $0)} też. jeśli pojedynczy \n nie działa.

Jeśli nadal nie działa, być może trzeba sprawdzić terminator linii. To może nie być właściwe. Użyj zmiennej RS w awk, aby oddzielić ją na nietypowym łączu linii.

+0

Wygląda na to, że w ogóle nie działa. Drugi powoduje pewne błędy. pierwszy nie drukuje w ogóle poprawnych wyników. Właściwie chcę skopiować co trzecią linię w pliku do innego pliku, to wszystko. – mane

+1

Myślę, że terminator linii plików jest nieprawidłowy. –

+0

Dzięki Shiplu. Terminator linii nie był prawidłowy. Teraz działa. – mane

2

Użyj następujących z print dla każdej linii:

awk 'NR%3==0 { print $0 }' /input/file_foo >> output/file_foobar 
3

Myślę, że problem jest w sposób jesteś przedstawiający dane, a nie w przetwórstwie.

$ cat x 
1 
2 
AA 
4 
5 
AA BB 
7 
8 
AA BB CC 
10 
11 
AA BB CC DD 
$ awk 'NR%3==0' x 
AA 
AA BB 
AA BB CC 
AA BB CC DD 
$ 

Podejrzewam, że to co robisz jest podobny do:

$ awk 'NR%3==0' x > y 
$ x=$(<y) 
$ echo $x 
AA AA BB AA BB CC AA BB CC DD 
$ echo "$x" 
AA 
AA BB 
AA BB CC 
AA BB CC DD 
$ 

To cię mylić. Zobacz także: Capturing multi-line output to a bash variable.

+0

To działa dobrze. Dzięki – mane