줄 바꿈을 인쇄하지 않고 awk


169

변수 합계 / NR을 각 반복마다 나란히 인쇄하고 싶습니다. 각 반복에서 줄 바꿈을 인쇄하여 awk를 피하는 방법은 무엇입니까? 내 코드에서는 줄 바꿈이 기본적으로 각 반복마다 인쇄됩니다.

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

출력이 다음과 같이 나타나기를 원합니다.

cg_c ans1  ans2  ans3  
ep_c ans1  ans2  ans3 
is_c ans1  ans2  ans3
tau  ans1  ans2  ans3 
xhpl ans1  ans2  ans3

내 현재 출력은 다음과 같습니다

**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3

답변:


219

awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls

print기본적으로 개행을 삽입합니다. 당신은 그런 일을 원하지 않기 때문에 printf대신 사용하십시오.


4
그러나 printf해석 %s하기 때문에 printf "%s" whatever대신 사용하십시오 printf whatever.
Matthieu 2019

1
printf "%s",whatever쉼표를 잊어 버렸습니다. 더 많은 변수로 확장하고 쉼표로 구분할 수도 있습니다.
Hielke Walinga

74

AWK의 ORS (출력 레코드 구분 기호) 변수는 기본적으로 "\ n"이며 모든 줄 뒤에 인쇄됩니다. BEGIN모든 내용을 연속적으로 인쇄 하려면 섹션 에서 ""로 변경할 수 있습니다 .


6
""공백이 없도록 설정해도됩니다 (공백 없음).
mschilli

8
이처럼 :awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
프레드릭 Erlandsson

2
또는 ORS="\r"예를 들어 진행률을 보여주는 카운터를 인쇄하려는 경우.
Skippy le Grand Gourou

47

많은 사람들이이 질문에 들어가서에서 새로운 줄을 피하는 방법을 찾고 있다고 생각 awk합니다. 따라서 특정 컨텍스트에 대한 답변이 이미 해결되었으므로 이에 대한 해결책을 제공 할 것입니다!

에서 awk, 인쇄 후를 print자동으로 삽입합니다 ORS. ORS"출력 레코드 구분 기호"를 나타내며 기본값은 새 줄입니다. 그래서 당신이 말할 때마다print "hi" awk가 "hi"+ 새 줄을 인쇄 .

이것은 두 가지 다른 방법으로 변경 될 수 있습니다 : 비어 ORS있거나 사용printf .

빈 사용 ORS

awk -v ORS= '1' <<< "hello
man"

"helloman"을 모두 반환합니다.

여기서 문제는 모든 awk가 empty 설정을 허용하지 않으므로 ORS다른 레코드 구분 기호를 설정해야한다는 것입니다.

awk -v ORS="-" '{print ...}' file

예를 들면 다음과 같습니다.

awk -v ORS="-" '1' <<< "hello
man"

"hello-man-"을 반환합니다.

사용 printf (권장)

하지만 print첨부합니다 ORS기록 후, printf하지 않습니다. 따라서 printf "hello""hello"만 인쇄합니다.

$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye

마지막으로, 이것은 마지막 새 줄을 놓치므로 쉘 프롬프트는 출력의 마지막 줄과 같은 줄에있게됩니다. 이를 청소하려면 END {print ""}모든 처리 후에 새 줄이 인쇄되도록 사용 하십시오.

$ seq 5 | awk '{printf "%s", $0}'
12345$
#    ^ prompt here

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345

5

일방 통행

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls

1
마이너 참고 : 사용하지 않을 printf $0때문에, $0같은 문자열을 포함 할 수있다 %F, 등등 ... 쉽게 수행하면 (GAWK와 적어도 3.1.5) 실패합니다 echo "%F"|awk '{printf $0}'. printf "%s",$0대신 사용하십시오 .
Vlad

2

다음과 같이 ORS를 동적으로 간단하게 사용할 수 있습니다.

awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out


1

Perl이 옵션이라면, fedorqui의 예제를 사용하는 솔루션이 있습니다 :

seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'

설명 :
chomp줄 바꾸기를 제거하여
print "$_ "각 줄 을 인쇄
하고 END{}블록이 줄 바꾸기를 인쇄하는 데 사용되는 공간을 추가합니다.

산출: 1 2 3 4 5

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.