web-dev-qa-db-ja.com

ファイルのBASH条件に複数の行があることを確認する方法は?

ファイルに複数の行があるかどうかを確認する必要があります。私はこれを試しました:

if [ `wc -l file.txt` -ge "2" ]
then
    echo "This has more than 1 line."
fi


if [ `wc -l file.txt` >= 2 ]
then
    echo "This has more than 1 line."
fi

これらはエラーを報告するだけです。ファイルのBASH条件に複数の行があるかどうかを確認するにはどうすればよいですか?

19
Village

コマンド:

_wc -l file.txt
_

次のような出力が生成されます。

_42 file.txt
_

wcを使用すると、ファイル名もわかりやすく表示されます。これは、一度に多くのファイルをチェックアウトしていて、個別の統計と合計の統計が必要な場合にこれを行います。

_pax> wc -l *.txt
 973 list_of_people_i_must_kill_if_i_find_out_i_have_cancer.txt
   2 major_acheivements_of_my_life.txt
 975 total
_

標準入力でデータを提供することで、wcがこれを行うのを止めることができるので、knowファイル名ではありません:

_if [[ $(wc -l <file.txt) -ge 2 ]]
_

次のトランスクリプトは、これが実際に実行されていることを示しています。

_pax> wc -l qq.c
26 qq.c

pax> wc -l <qq.c
26
_

余談ですが、_[[ ]]_と$()を使用するように切り替えたことにも気づくでしょう。

前者は後方互換性による問題が少ないため(主に文字列の分割に関連する)、後者は実行可能ファイルをネストする方がはるかに簡単であるため、私は前者を好みます。

33
paxdiablo

mapfileを使用した純粋なbash(≥4)の可能性:

#!/bin/bash

mapfile -n 2 < file.txt
if ((${#MAPFILE[@]}>1)); then
    echo "This file has more than 1 line."
fi

mapfileビルトインは、stdinから読み取ったものを配列(デフォルトではMAPFILE)に格納します(フィールドごとに1行)。 -n 2を使用すると、最大で2行が読み取られます(効率のため)。その後、配列MAPFILEに複数のフィールドがあるかどうかを確認するだけです。この方法は非常に効率的です。

副産物として、必要に応じて、ファイルの最初の行は${MAPFILE[0]}に保存されます。末尾の改行文字がトリミングされていないことがわかります。末尾の改行文字を削除する必要がある場合は、-tオプションを使用します。

mapfile -t -n 2 < file.txt
6
gniourf_gniourf

どうですか:

if read -r && read -r
then
  echo "This has more than 1 line."
fi < file.txt

-rフラグは、行継続文字が2行を1行に折り畳まないようにするために必要です。これにより、次のファイルは1行のみを報告します。

This is a file with _two_ lines, \
    but will be seen as one.
4
Scrutinizer
if [ `wc -l file.txt | awk '{print $1}'` -ge "2" ]
...

各サブコマンドが返すものを常に確認する必要があります。コマンドwc -l file.txtは、次の形式で出力を返します。

12 file.txt

最初の列が必要です-awkまたはcutまたは任意の他のユーティリティで抽出できます。

3
plesiv

大きなファイルを扱う場合、このawkコマンドはwcを使用するよりもはるかに高速です。

awk 'BEGIN{x=0}{if(NR>1){x=1;exit}}END{if(x>0){print FILENAME,"has more than one line"}else{print FILENAME,"has one or less lines"}}' file.txt

1
tungufoss