シェルスクリプトでオプションの入力を処理する方法は?

シェルスクリプトでオプションの入力を処理する方法は?

私の課題は、テキストファイルから最長の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コマンドライン解析の使用を検討する必要があります。このウェブサイトにはこれの多くの例があります(次を見ることから始めることができます)。ブランド)。

関連情報