내 숙제는 텍스트 파일에서 가장 긴 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
명령줄 구문 분석 사용을 고려해야 합니다 . 이 웹사이트에는 이에 대한 많은 예가 있습니다(다음을 살펴보는 것으로 시작할 수 있습니다).선택 항목 가져오기상표).