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