< pool.sam awk '
/./ {printf $1}
{printf $7+1,"\t"}
{printf $3,"\t"}
{
if($2 !=16) {print "\t", "+";} else {print "\t","-";}
{printf $4,"\t" ,length($10)+$4, "\t", "1"}
}'
나는 모든 값을 얻었지만 이상한 방식으로 얻었습니다. 7개의 값을 인쇄하고 있습니다.
값 1 값 2 값 3 값 7
각 행에 TAB으로 구분된 7개의 값을 모두 갖고 싶습니다.
답변1
printf
당신은 이 일을 위해 많은 일을 했습니다. 단순히 다음과 같은 작업을 수행하면 어떨까요?
cat pool.sam |\
awk '/./ {printf $1,$7+1,"\t"$3,"\t",($2!=16)?"+","-",$4,"\t",length($10)+$4,"\t1"}}'
답변2
printf
그것은 비록인쇄 서식기능, print
연결 매개변수.
해당 기능(또는 둘 다)을 확인해야 할 것 같습니다 printf
.
간단히 말해서:
printf <format, <parameter1>[, <parameter2>, ...] | text>
%
형식의 문자 표현여기에는 다음과 같은 형식의 매개변수가 있습니다.. 형식에는 특수 시퀀스(예: )가 포함될 수 있습니다 \t
. \n
실제로 Printf아니요개행 문자로 출력을 종료합니다. 인수가 하나만 주어지면 일반적으로 그대로 인쇄됩니다.
숫자인 경우 기본 형식은 " %.6g
"입니다.
CODE : printf 1.123456789
RESULT: 1.12346
이면 일반적 $1
으로 1.123456789
다음과 같은 텍스트로 처리됩니다.
CODE : printf $1
RESULT: 1.123456789
CODE : printf $1+0 # Force conversion to number
RESULT: 1.12346
여러 인수를 제공하는 경우 첫 번째 인수가 형식으로 사용되고 나머지는 인수로 사용됩니다. 패턴을 만족시키기 위해 인수가 거의 주어지지 않으면 동작은 다음과 같습니다.명확하지 않다.
printf "%d %s\n", 123, "hello"
|| | | | |
|| | | | +----- Parameter 2
|| | | +------------ Parameter 1
|| | +----------------- Print new-line
|| +------------------- Print parameter 2 as string
|+--------------------- Print literal space
+---------------------- Print parameter 1 as digit
printf "%d %s\n", 123, "hello"
# Gives: 123 hello
printf "%d %s\n", "hello", 123
# Gives: 0 123
printf "%d %s\n", 123
# Gives undefined result (according to format one parameter is missing)
자리 표시자 없이 인수가 제공되면 해당 인수는 삭제됩니다.
printf "%d", 123
# Gives: 123
printf "%d", 123, 22
# Gives: 123
printf "%d", 123, 22, "\t", "foo", 5566, 12.55, "\n", "blah"
# Gives: 123
캐릭터 %
표현"변환사양입니다". awk
에서 정의하지 않은 등 잘못된 사양이 제공된 경우명시되지 않은. 다른 텍스트는 일반 텍스트로 처리됩니다.
printf "Hello %w", "what"
# Usually: Hello %w
# But no guarantee
printf "ABC", "DEF", "GHI"
# Result: ABC
코드에서는 파일 입력을 printf의 형식으로 사용하는 경우가 많습니다. 이러한 필드의 printf
형식이 지정되지 않은 경우 일반 텍스트로 인쇄됩니다. 매개변수는 삭제됩니다.
# Example, say:
# $4 = "%d %s\n"
# $8 = "33.2"
# $9 = "good"
printf $4, $8, $9
#
# Result: 33 good
# Say:
# $4 = "14"
# $8 = "33.2"
# $9 = "good"
printf $4, $8, $9
#
# Result: 14
printf $4, "\t", $8, "\t", $9
#
# Result: 14
스크립트 형식은 다음과 같습니다.
< pool.sam awk '
# 1.
/./ { # IF line not empty THEN
printf $1 # print field 1
} # ENDIF
# 2.
{
printf $7 + 1, "\t" # printf with format = $7 + 1 and parameter <tab>
}
# 3.
{
printf $3, "\t" # printf with format = $3 and parameter <tab>
}
# 4.
{
# 4.1
if ($2 != 16) { # IF field 2 is not 16 THEN
print "\t", "+"; # print <tab> + "+" (Terminate with newline)
} else { # ELSE
print "\t", "-"; # print <tab> + "-" (Terminate with newline)
} # ENDIF
# 4.2
{
printf $4, "\t", length($10) + $4, "\t", "1"
# printf: pattern="field 4"
# parameters=<tab>, length of field 10 + field 4
}
}
'
당신이 가지고 있다고 가정 해 봅시다 :
$ cat pool.sam
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
그러면 다음이 제공됩니다(위 코드의 숫자 사용).
1. printf "1"` => `1`
2. printf 8, "\t"` => `8`
3. printf "3", "\t" => `3`
4.1 print "\t", "+" => `<tab>+<new-line>`
4.2 printf "4", "\t", 6, "\t", "1" => `4`
최종 결과:
183 +
4
다시 작성하면 다음과 같은 통찰력을 얻을 수 있습니다.
awk '
/./ {
printf "%s%d\t%d\t", $1, $7 + 1, $3
if ($2 != 16) {
printf "+"
} else {
printf "-"
}
printf "%d\t%d\t1\n", $4, length($10) + $4
}
' pool.sam
if 문(혼란의 위험이 있음)을 한 번에 작성할 수도 있습니다.
printf "%s", $2 != 16 ? "+" : "-"
형식 문자열과 printf
.aligned 형식을 읽는 것은 부동 소수점 형식과 마찬가지로 매우 유용한 경우가 많습니다.
right_pad=-10
printf "%*s: %5d\n", right_pad, "vix", 23
printf "%*s: %5d\n", right_pad, "popul", 336
printf "%*s: %5.2f\n", right_pad, "vidi", 42.129542488
printf "%5s %-10d +%d\n", "OK", 33, 44
산출:
vix : 23
popul : 336
vidi : 42.13
OK 33 +44
(적어도 제가 찾은) 가장 쉬운 방법은 게임을 플레이하는 동안 명령줄 대신 스크립트를 사용하는 것입니다.