다음을 계산하는 for 루프를 실행하고 싶습니다. awk
10번 실행하고 출력을 합산하여 최종 결과를 인쇄합니다. 코드는 아래에 첨부되어 있습니다:
sum=0
for i in {1..10}
do
count=`awk '{if ($NF==$i) {print $NF}}' * | wc -l`
sum=$[sum+count]
echo $sum
done
문제는 으로 변경하면 $NF==$i
결과 $NF==1
는 정확하지만 for 루프를 사용하여 10번 실행하고 싶다는 것입니다.
코드에 어떤 문제가 있나요?
답변1
다음에서 모든 작업을 수행하는 것이 더 효율적입니다 awk
.
awk -v n=0 '
{for (i = 1; i <= 10; i++) if ($NF == i) {n++; break}}
END {print n}' ./*
또는 마지막 필드가 항상 정수인 경우:
awk -v n=0 '
$NF >= 1 && $NF <= 10 {n++}
END {print n}' ./*
또는 어휘적 비교를 원하고 이러한 숫자의 표현( 1
,, ... 대신 ) 2
만 허용 하려는 경우:3
10
01
1e0
1.0
awk -v n=0 '
$NF ~ /^([123456789]|10)$/ {n++}
END {print n}' ./*
답변2
여기서 문제는 작은따옴표 내에서 쉘 변수 확장을 수행하려고 한다는 것입니다 ' ... '
. 그러나 작은따옴표 안에는껍데기변수 확장이 일시 중지되었습니다(예:이 답변여기 아니면Lhunath와 GreyCat의 Bash 가이드), 이것이 실제로 권장되는 이유입니다. $
개별 입력 필드를 역참조할 때 유사한 기능이 수행되기 때문에 awk
(그러나 필드 번호는 예를 들어 에서와 같이 변수 이름으로 표시될 수도 있음 $NF
) 단일 입력 필드에 프로그램을 캡슐화합니다. 동시 "변수 확장".
awk
귀하의 경우에는 다음을 사용하여 값을 프로그램으로 "가져올" 수 있습니다.
awk -v fieldnr="$i" '{if ($NF==fieldnr) {print $NF}}'
그럼에도 불구하고 귀하의 문제는 완전히 해결 가능한 것으로 보이 awk
므로 달성하려는 작업을 더 자세히 설명하고 더 우아하고 더 빠른 접근 방식을 찾으려고 노력할 수 있습니다. 질문이 타당할 수도 있습니다...
답변3
귀하의 스크립트가 제가 생각하는 대로 수행한다면(즉, sum
1에서 10까지 반복하면서 일치하는 줄의 증분 값을 인쇄하는 경우), 쉘 스크립트가 생성할 출력을 생성하기 위해 실제로 필요한 것은 다음과 같습니다.
awk '
{ counts[$NF]++ }
END {
for (i=1; i<=10; i++) {
sum += counts[i]
print sum
}
}
' *
위의 내용은 테스트할 샘플 입력/출력을 제공하지 않았기 때문에 테스트되지 않았습니다.
답변4
#!/bin/bash
# Tested with -- GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
set -e
for i in `seq 1 1000`
do
echo $i
# Run your command here
done