연결 지침에 대한 질문

연결 지침에 대한 질문

세미콜론으로 구분된 csv 파일과 일부 정교함을 수행하는 Korn 쉘 스크립트가 있습니다. Korn 셸에서 다음 두 명령이 수행하는 작업을 이해하려고 합니다.

num_rec=`cat test.csv |wc -l|tr -d " " | nawk '{printf("%0.6d\n",  $1) }'`
num_rec=`expr $num_rec + 2 | nawk '{printf("%0.6d\n",  $1) }'`

연결을 사용하는 두 개의 명령처럼 보이지만 최종 결과는 무엇입니까? nawk 명령에서 "$1"은 무엇입니까?

답변1

이 두 명령을 분석해 보겠습니다.

num_rec=`cat test.csv |wc -l|tr -d " " | nawk '{printf("%0.6d\n",  $1) }'`

복합 명령은 다음과 같습니다. A | B | D

  • 답변: cat test.csvcats 파일 test.csv(UUOC, "Useless Use Of Cat"이라고도 함)
  • B: wc -l행 수는 입력(stdin)에서 계산됩니다. 여기에 test.csv의 내용이 있습니다. 따라서 "test.csv"의 행 수를 계산합니다. [...notetest.csv의 마지막 행에 마지막 "줄바꿈"이 누락된 경우 마지막 행은 계산되지 않습니다....]
  • C: tr -d " " :tr은 wc -l이 줄 번호의 출력을 채우는 데 사용하는 " "(공백)을 모두 제거합니다. 이렇게 하면 숫자(및 종료 줄 바꿈)만 유지됩니다.
  • 마지막 D:: nawk '{printf("%0.6d\n", $1)'여기서 $1은 awk 내부에 있으며 "현재 줄의 첫 번째 필드"를 의미합니다. 수신하는 각 줄에 대해 이 nawk는 첫 번째 필드만 인쇄하고 숫자로 형식을 지정합니다. INT(%d)로 시작하지만 최소 6자리가 되도록 시작 부분에 0을 채웁니다(여기서 "."는 무시됩니다). , 내가 아는 한...쉼표 뒤에 6자리 부동 소수점 숫자를 출력하는 %0.6f와 비교)

두 번째 줄:

num_rec=`expr $num_rec + 2 | nawk '{printf("%0.6d\n",  $1) }'`

숫자에 2를 추가하고(참고: expr의 경우 000008은 괜찮고 "8"로 처리되지만 셸에서는 잘못된 8진수로 처리됩니다) 같은 방식으로 다시 형식을 지정합니다.

이 모든 것은 다음과 같이 단순화될 수 있습니다.

num_rec=$(printf "%0.6d\n" "$(( $(wc -l < test.csv) + 2 ))")

따라서 이 작업은 .csv의 행 수를 계산하고(해당 행의 내용이 무엇이든...) 2를 더한 다음 결과를 "num_rec" 앞에 "0"이 6 이상 입력되도록 하는 것입니다. 숫자.

예를 들어, 32줄의 test.csv 파일은 num_rec에 저장됩니다.000034

(경고: 쉘의 0nnnn은 일반적으로 8진수로 처리되므로 $num_rec는 이후 매우 신중하게 처리해야 합니다...)

답변2

90년대 초반 이후 아무것도 배우지 않았거나 그 시대의 HOWTO를 따르는 초보자가 작성한 명령입니다. 다음과 같이 작성하는 것이 좋습니다.

num_rec=$(wc -l <test.csv)
num_rec=$(printf "%0.6d" $(( num_rec + 2 )) )

이는 다음을 사용합니다.명령 대체test.cv사용된 줄 수를 가져옵니다 ( 파일 이름과 줄 번호가 인쇄되지 않도록 wc -l리디렉션하여 ).wc

그런 다음 명령 대체를 다시 사용합니다. 이번에는 printf형식 문자열을 사용하여 행 수를 0으로 채워서 고정 너비가 6비트가 되도록 하고 쉘 산술을 사용하여 2를 추가합니다 $num_rec.

$1원래 명령에서 는 awk입력된 첫 번째 필드를 나타냅니다(이 경우 줄 번호 wc).

관련 정보