쉘 스크립트에서 선택적 입력을 처리하는 방법은 무엇입니까?

쉘 스크립트에서 선택적 입력을 처리하는 방법은 무엇입니까?

내 숙제는 텍스트 파일에서 가장 긴 n 줄을 인쇄하는 것입니다. 출력은 줄 번호가 포함된 가장 긴 n 줄이며 원본 파일과 동일한 순서입니다. 예를 들어 원본 파일에서는 다음과 같습니다.

09876543
kbjkbkbbnbnmbnmnmmnbmnbmjbjkb
asjdsakdbakjsdbasbkj
asjdsakdbakjsdbasbkj
asjdsakdbakjsdbasbkj
sa
aaaa
njkasn
k
ppûunsdj
tieutuvi
eee
sdbhsdbjhdsvfdsvfgj
avavdvas
dfsdf
ffdsdfggdgdgdfgdfgdf112233
qwertyuiopsdfghjklxcvbnm,fghjk

n이 10이면 출력은 다음과 같아야 합니다.

2 kbjkbkbbnbnmbnmnmmnbmnbmjbjkb
3 asjdsakdbakjsdbasbkj
4 asjdsakdbakjsdbasbkj
5 asjdsakdbakjsdbasbkj
10 ppûunsdj
11 tieutuvi
13 sdbhsdbjhdsvfdsvfgj
14 avavdvas
16 ffdsdfggdgdgdfgdfgdf112233
17 qwertyuiopsdfghjklxcvbnm,fghjk

n이 할당되지 않은 경우 기본 숫자는 5입니다. 입력 파일이 2개 이상인 경우 각 줄 목록 앞에는 해당 파일 이름이 옵니다. 어떻게 해야 하나요? 매개변수 n을 어떻게 처리해야 합니까? 예를 들어 매개변수 n을 입력해야 하는 경우 이 코드가 작동합니다.

awk '{ print length(), NR, $0 | "sort -rn" }' unix1.txt | head -n 10 | sed 's/[^ ]* //' | sort -n

그러나 n이 선택적 매개변수인 경우에는 아무런 효과가 없습니다. 또한 많은 파일을 처리하는 방법도 모릅니다.

awk '{ print length(), NR, $0 | "sort -rn" }' unix1.txt | head -n ${$1:-5} | sed 's/[^ ]* //' | sort -n >> temp.txt

답변1

귀하의 파이프라인이 단일 매개변수(반환할 행 수)를 사용하는 스크립트의 일부라고 가정합니다.

매개변수 확장은 ${$1:-5}아무런 효과가 없으며 비어 있거나 설정되지 않은 경우 ${1:-5}확장 되도록 작성해야 합니다.5$1

또한 awk코드 호출은 sort다소 혼란스럽습니다. 특히 파이프라인에 자체 단계로 쉽게 삽입될 수 있기 때문입니다.

awk '{ print length(), NR, $0 }' unix1.txt | 
sort -rn |
head -n "${1:-5}" |
sed 's/[^ ]* //' |
sort -n

조금 단순화하고( sed로 대체 cut) 출력을 보다 "표 형식"으로 만들기 위해 awk탭을 출력 구분 기호로 사용하여 중간 결과를 출력할 수 있습니다.

awk -v OFS="\t" '{ print length(), NR, $0 }' unix1.txt | 
sort -rn |
head -n ${1:-5} |
cut -f 2- |
sort -n

주어진 데이터에 대해 다음과 같은 기본 출력 라인 수를 출력합니다.

2       kbjkbkbbnbnmbnmnmmnbmnbmjbjkb
4       asjdsakdbakjsdbasbkj
5       asjdsakdbakjsdbasbkj
16      ffdsdfggdgdgdfgdfgdf112233
17      qwertyuiopsdfghjklxcvbnm,fghjk

스크립트에서 여러 파일을 처리하려면 지정된 파일 이름을 반복하는 것이 좋습니다. 어쩌면 좋아

#!/bin/sh

n=${1:-5}
shift

for name do
    if [ "$#" -gt 1 ]; then
        printf 'File: %s\n' "$name"
    fi

    awk -v OFS="\t" '{ print length(), NR, $0 }' "$name" | 
    sort -rn |
    head -n "$n"
    cut -f 2- |
    sort -n
done

스크립트는 다음과 같이 호출됩니다.

./script.sh 10 file1 file2 file3 etc

이 점에 유의하시기 바랍니다필요bash첫 번째 매개변수는 항상 숫자입니다(스크립트에는 특별한 내용이 없으므로 /bin/sh이를 인터프리터로 사용합니다). 올바른 명령줄 옵션을 사용하여 스크립트에 숫자를 제공하십시오.

./script -n 10 file1 file2

getopts명령줄 구문 분석 사용을 고려해야 합니다 . 이 웹사이트에는 이에 대한 많은 예가 있습니다(다음을 살펴보는 것으로 시작할 수 있습니다).상표).

관련 정보