
私は一般的なUNIXコマンドを使用するシェルスクリプトを書いています。スペースを含む)文字が最も少ない行を検索する必要があります。最大20行まで可能です。
head -$L | tail -1 | wc -m
L行を見つけるために使用できる文字数を知っています。問題は、私が考えることができる唯一の方法は、値を比較する複数のifステートメントを手動で作成することです。
データ例:
seven/7
4for
8 eight?
five!
4for
この行は文字数が最も少ないため返されます。
私の場合、複数の行の長さが最も短い場合は単一の行を返す必要があります。最小長ならどれを選んでも構いません。しかし、他の状況では、他のユーザーに両方の方法を表示するのに何の害もないと思います。
答え1
awk
以下は、見つかった最初の最小の行を印刷するソリューションのバリエーションです。
awk '
NR==1 || length<len {len=length; line=$0}
END {print line}
'
条件付き拡張により、最小限の行をすべて印刷できます。
awk '
length==len {line=line ORS $0}
NR==1 || length<len {len=length; line=$0}
END {print line}'
'
答え2
そしてsqlite3
:
sqlite3 <<EOT
CREATE TABLE file(line);
.import "data.txt" file
SELECT line FROM file ORDER BY length(line) LIMIT 1;
EOT
答え3
パール方式。長さが同じで最短行が複数ある場合、このメソッドはそのうちの 1 つだけを印刷します。
perl -lne '$m//=$_; $m=$_ if length()<length($m); END{print $m if $.}' file
説明する
perl -lne
:-n
「入力ファイルを 1 行ずつ読み込む」を意味し、各入力-l
行から末尾の改行を削除し、各呼び出しに改行を追加print
し、各行-e
に適用するスクリプトです。$m//=$_
:未定義の場合は$m
現在の行($_
)に設定されます。$m
この//=
演算子は Perl 5.10.0 から使用できます。$m=$_ if length()<length($m)
:現在の値の長さが$m
現在の行の長さより長い場合は、$_
現在の行()をとして保存します$m
。END{print $m if $.}
:すべての行を処理した後、$m
最短行の現在値を出力します。if $.
空白の入力に対して空白行が印刷されるのを防ぐには、行番号()を定義したときにのみこれが発生することを確認してください。$.
または、ファイルがメモリに入るほど小さいので、次のことができます。
perl -e '@K=sort{length($a) <=> length($b)}<>; print "$K[0]"' file
説明する
@K=sort{length($a) <=> length($b)}<>
:<>
要素がファイルの行である配列です。長さによってソートされ、ソートされたsort
行は配列として保存されます@K
。print "$K[0]"
:配列の最初の要素@K
(最も短い行)を印刷します。
印刷したい場合みんな利用できる最短路線
perl -e '@K=sort{length($a) <=> length($b)}<>;
print grep {length($_)==length($K[0])}@K; ' file
答え4
私は常に純粋なシェルスクリプト(execなし!)を使用するソリューションを好みました。
#!/bin/bash
min=
is_empty_input="yes"
while IFS= read -r a; do
if [ -z "$min" -a "$is_empty_input" = "yes" ] || [ "${#a}" -lt "${#min}" ]; then
min="$a"
fi
is_empty_input="no"
done
if [ -n "$a" ]; then
if [ "$is_empty_input" = "yes" ]; then
min="$a"
is_empty_input="no"
else
[ "${#a}" -lt "${#min}" ] && min="$a"
fi
fi
[ "$is_empty_input" = "no" ] && printf '%s\n' "$min"
ノート:
入力にNULバイトに問題があります。したがって、代わりにprintf "ab\0\0\ncd\n" | bash this_script
印刷してください。ab
cd