2013-06-13 16 views
5

Mam krótkie pytanie dotyczące polecenia AWK. Potrzebuję polecenia drukowania do końca linii na tej samej linii, ale kiedy dojdzie do następnej linii, potrzebuję jej do wydrukowania na innej linii. Poniższy przykład zapewni lepszą klarowność.Komenda AWK do wydrukowania do końca wiersza

Say mam plik:

0 1 2 3 This is line one 
0 1 2 3 This is line two 
0 1 2 3 This is line three 
0 1 2 3 This is line four 

Próbowałem następujące i zdobyć następujące wyniki

awk '{for(i=5;i<=NF;i++) print $i}' fileName >> resultsExample1 

otrzymuję następujący w resultsExample1

This 
is 
line 
one 
This 
is 
line 
two 
And so on.... 

przykładzie 2:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample2 

dla resultsExample2 uzyskać:

This is line one This is line two this is line three This is line four 

Próbowałem również:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample3 

Ale wyniki były takie same jak w poprzednim jednej

w końcu ma się co następuje:

This is line one 
This is line two 
This is line three 
This is line four 

Jestem wdzięczny za każdą pomoc! góry dzięki :)

+2

Na przykład, wszystkie linie mają taką samą liczbę kolumn - jest to zawsze bywa z wejściem? –

Odpowiedz

6

może być bardziej prosta w użyciu cut:

$ cut -d' ' -f5- file 
This is line one 
This is line two 
This is line three 
This is line four 

Ten mówi: na przestrzeni oddzielonych pól, druku od 5 aż do końca linii.

Jeśli masz wiele spacji pomiędzy polami, możesz początkowo chcieć je wycisnąć za pomocą tr -s' '.

+6

Działa to tylko wtedy, gdy pomiędzy polami jest tylko jedna spacja. – Scrutinizer

+3

To prawda, @Scrutinizer, ale gdyby było więcej niż jedno, moglibyśmy najpierw potroić '| tr -s "", aby usunąć wiele spacji. – fedorqui

+0

Jak byś sobie z tym poradził, gdyby liczba spacji (ogranicznika) zmieniała się z jednego rekordu do drugiego? Na przykład stosując to do wyjścia 'ls -l'? – gone

7

OR z awk

awk '{$1=$2=$3=$4=""; sub(/^ */,"", $0); print }' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

Ponadto, rozwiązanie to jesteś prawie tam, po prostu trzeba wymusić '\ n' mają być drukowane na końcu każdej przetwarzanej linii, tj

awk '{for(i=5;i<=NF;i++) {printf $i " "} ; printf "\n"}' awkTest2.txt 
This is line one 
This is line two 
This is line three 
This is line four 

Pamiętaj, że Twój BEGIN { " " } jest bez op. I powinieneś użyć $i zamiast $1, aby wydrukować bieżącą wartość iteracji.

IHTH.

Edytuj; Zauważając sprzeciw sudo_O, dodałem% s do danych. Oto wynik

This is line one 
This is line two 
This is line three 
T%shis is line four 

Może to być problem dla ciebie, więc to, że sprawa przeczytać o tym, jak przekazać ciąg do formatu printf.

+2

Nie powinieneś używać 'printf' bez określenia formatu. Jak myślisz, co się stanie, jeśli jedno z pól zawiera na przykład '% s'? –

+0

Zgadzam się z sudo_O. Powinieneś otrzymać 'awk: niewystarczające argumenty w printf (T% shis)' na przykład .. – Scrutinizer

+1

Muszę nadrobić moje wyniki. Powodzenia wszystkim. – shellter

5

Wiem, że to pytanie jest bardzo stary, ale kolejny przykład awk:

awk '{print substr($0,index($0,$5))}' fileName 

Co robi: znaleźć indeks, w którym chcesz rozpocząć drukowanie (indeks $ 5 w $ 0) i wydrukować podciąg 0 USD począwszy od tego indeksu.

+1

Może się spóźnić na imprezę, ale zadziałało to dla mnie świetnie. +1 =) – Terrance

0

awk '{gsub (/[[:digit:]]/,"");{$1=$1}}1' file

Powiązane problemy