for 루프 변수를 사용하여 bash에서 다른 명령 실행

for 루프 변수를 사용하여 bash에서 다른 명령 실행

다음을 계산하는 for 루프를 실행하고 싶습니다. awk10번 실행하고 출력을 합산하여 최종 결과를 인쇄합니다. 코드는 아래에 첨부되어 있습니다:

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만 허용 하려는 경우:310011e01.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

귀하의 스크립트가 제가 생각하는 대로 수행한다면(즉, sum1에서 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

관련 정보