Chcę, aby zmienna suma / NR była drukowana obok siebie w każdej iteracji. Jak uniknąć wypisywania znaku nowej linii w każdej iteracji przez awk? W moim kodzie nowa linia jest drukowana domyślnie w każdej iteracji
for file in cg_c ep_c is_c tau xhpl
printf "\n $file" >> to-plot.xls
for f in 2.54 1.60 800
awk '{sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
done
done
Chcę, aby wynik wyglądał tak
cg_c ans1 ans2 ans3
ep_c ans1 ans2 ans3
is_c ans1 ans2 ans3
tau ans1 ans2 ans3
xhpl ans1 ans2 ans3
moje obecne wyjście jest takie
**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
printf
interpretuje,%s
więc używajprintf "%s" whatever
zamiastprintf whatever
.printf "%s",whatever
Zapomniałeś o przecinku. Możesz także rozszerzyć o więcej zmiennych i oddzielić je przecinkami.Zmienna ORS (separator rekordów wyjściowych) w AWK ma wartość domyślną "\ n" i jest drukowana po każdym wierszu. Możesz zmienić to na „” w
BEGIN
sekcji, jeśli chcesz, aby wszystko było drukowane po kolei.źródło
""
(bez spacji), aby w ogóle nie było separacji.awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
ORS="\r"
jeśli chcesz np. Wydrukować licznik pokazujący postęp.Myślę, że wiele osób wchodzi w to pytanie, szukając sposobu na uniknięcie nowej linii
awk
. Dlatego mam zamiar zaproponować rozwiązanie tego problemu, ponieważ odpowiedź na konkretny kontekst została już rozwiązana!W
awk
,print
automatycznie wstawia aORS
po wydrukowaniu.ORS
oznacza „output record separator” i domyślnie przyjmuje nową linię. Więc ilekroć powiesz,print "hi"
awk wypisze „cześć” + nowa linia.Można to zmienić na dwa różne sposoby: używając pustego
ORS
lub używającprintf
.Korzystanie z pustego pliku
ORS
To zwraca „helloman”, wszystko razem.
Problem polega na tym, że nie wszystkie awks akceptują ustawienie pustego
ORS
, więc prawdopodobnie będziesz musiał ustawić inny separator rekordów.Na przykład:
Zwraca „hello-man-”.
Używanie
printf
(preferowane)Chociaż
print
załącza sięORS
po płycie,printf
nie. Dlategoprintf "hello"
po prostu drukuje „cześć”, nic więcej.Na koniec zwróć uwagę, że generalnie pomija to ostatnią nową linię, więc znak zachęty powłoki będzie w tej samej linii, co ostatnia linia wyniku. Aby to wyczyścić, użyj,
END {print ""}
aby nowa linia została wydrukowana po całym przetwarzaniu.źródło
jednokierunkowa
źródło
printf $0
, ponieważ$0
mogą zawierać ciągi jak%F
, itp ... Po łatwo nie powiedzie się (przynajmniej z GAWK 3.1.5)echo "%F"|awk '{printf $0}'
. Użyjprintf "%s",$0
zamiast tego.Możesz po prostu dynamicznie używać ORS w następujący sposób:
awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out
źródło
Jeśli Perl jest opcją, oto rozwiązanie na przykładzie fedorqui:
seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'
Objaśnienie:
chomp
usuwaprint "$_ "
znak nowej linii drukuje każdy wiersz, dodając spację, wktórej
END{}
blok jest używany do wydrukowania nowego wierszawynik:
1 2 3 4 5
źródło