私は bash でいくつかのことをテストしていて、ファイル内の行数と一意の行数を比較することにしました。対応する値を格納する 2 つの一時変数を作成して比較するだけでよいことはわかっていますが、それを 1 行で行う方法について疑問に思っています。
たとえば、次のアプローチが機能すると思いました: test `wc -l filename` -eq `uniq filename|wc -l`
。エラーが発生します-bash: test: too many arguments
。どこに間違いがあるのでしょうか。一時変数を使用せずにこれを行うにはどうすればよいのでしょうか。
答え1
と は のみを出力wc -l file
するため、直接比較することはできません。@stelldriver が提案したように、 でファイルをの標準入力にリダイレクトしてのみが出力されるようにするか、awk を使用して最初のフィールドのみを取得してください (以下を参照)。[number] file
uniq file | wc -l
[number]
wc
wc -l < file
[number]
また、バックティックは読みにくくなります。$(command)
構造を優先します。
式が引用符で囲まれていないため、「引数が多すぎます」というメッセージが表示され、シェルは[number] file
出力を 1 つの単語ではなく 2 つの単語に分割します。
全体として、これがあなたが求めているものです:
test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
wc -l file
最初のフィールドだけを取得するために、出力を awk に渡します[number]
。
答えをより明確にするために、echo
コマンドの前に an を追加して、元の試行で何が起こるかを確認してください。
$ echo test `wc -l file` -eq `uniq file|wc -l`
test 19 file -eq 17
ご覧のとおり、test
コマンドには19
、file
、-eq
の4 つの引数があります17
。
私が提案したものを試してみると、次の 3 つの引数による適切な比較が得られますtest
。
$ echo test "$(wc -l file|awk '{print $1}')" -eq "$(uniq file|wc -l)"
test 19 -eq 17