ファイルに複数の行があるかどうかを確認する必要があります。私はこれを試しました:
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条件に複数の行があるかどうかを確認するにはどうすればよいですか?
コマンド:
_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
_
余談ですが、_[[ ]]
_と$()
を使用するように切り替えたことにも気づくでしょう。
前者は後方互換性による問題が少ないため(主に文字列の分割に関連する)、後者は実行可能ファイルをネストする方がはるかに簡単であるため、私は前者を好みます。
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
どうですか:
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.
if [ `wc -l file.txt | awk '{print $1}'` -ge "2" ]
...
各サブコマンドが返すものを常に確認する必要があります。コマンドwc -l file.txt
は、次の形式で出力を返します。
12 file.txt
最初の列が必要です-awk
またはcut
または任意の他のユーティリティで抽出できます。
大きなファイルを扱う場合、この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