세미콜론으로 구분된 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.csv
cats 파일 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
).