줄 바꿈을 인쇄하지 않고 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.