文字数が最も少ない行を見つける方法

文字数が最も少ない行を見つける方法

私は一般的なUNIXコマンドを使用するシェルスクリプトを書いています。スペースを含む)文字が最も少ない行を検索する必要があります。最大20行まで可能です。

head -$L | tail -1 | wc -mL行を見つけるために使用できる文字数を知っています。問題は、私が考えることができる唯一の方法は、値を比較する複数の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印刷してください。abcd

関連情報