ああ、スペースを削除してください

ああ、スペースを削除してください

出力ファイルの2行目の最初の文字が ""かどうか(空であるかどうか)を確認するスクリプトを作成しています。空の場合は「はい」を、そうでない場合は「いいえ」をエコーし​​たいと思います。私は今これを試しています。テストファイルには次の内容が含まれています。

###############
              #
# #############
#             #
# ######### # #
#         # # #
# ### ##### # #
#   #     # # #
# # ###########
# #            
###############

私のコードは次のとおりです


#!/bin/bash

line2=$(awk 'NR==2 {print; exit}' < test)
blank_check="${line2:0:1}"
if [ "blank_check" == " " ];
then
    echo "yes"
else    
    echo "no"
fi

問題が行にあるようではありません。line2=$(awk 'NR==2 {print; exit}' < test)これにより、すべてのスペースが削除され、line2が ""の代わりに "#"と同じように終わるためです。

2行目の最初の文字が""かどうかをテストする他のより良い方法はありますか?

答え1

シンプル

awk 'NR==2 && /^ / {print "yes"}' test

動作する必要があります。

または:

awk -vbool=no 'NR==2 && /^ / {bool="yes";exit} END {print bool}' test

または:

awk 'NR==2{print ($0~/^ /)?"yes":"no"; exit}' test

はいといいえの両方に固執する場合。


テスト速度は問題ないようです(テストは数回繰り返され、交換され、非常に簡単には表示されませんでした)。

$ printf '%s\n' $(1 5000000) >testa
$ printf '%s\n' "     #" >>testa

$ time awk '{print substr($0,1,1)==" "?"yes":"no"}NR==2000000{exit}' testa >/dev/null
run    : 0m2.437s sec

$ time awk '{print ($0~/^ /)?"yes":"no"}NR==2000000{exit}' test3 >/dev/null
run    : 0m1.746s sec

答え2

awk 'NR==2{ print substr($0, 1, 1)==" "?"yes":"no"; exit }' infile

これsubstr(s, i [, n])この関数は最初から最大文字の部分文字列を返すので、行nの最初の文字が空白であることを確認します。 "" print "yes" それ以外の場合は "no" (三項演算子で条件付き? "if-true) をチェックします。 " ": "False の場合")。si


同様の質問に答えるには(ファイルの最後の2行目と行の最後の文字を確認してください):

awk -v rvrslineNr=1 '
BEGIN{ cmd="/usr/bin/wc -l <\"" ARGV[1] "\""; cmd |getline NrLines; close(cmd) }
NR==NrLines-rvrslineNr { print substr($0, length(), 1)==" "?"yes":"no" }' infile

置くrvrslineNr=数字は、入力ファイルの終わりから始まる行番号を示します。最後の行の場合は0に設定し、2行目から最後の行の場合は1に設定します。

答え3

sed '2!d; s/^[^ ].*/no/; s/^$/no/; s/^ .*/yes/' file

2番目の行を除くすべての行が削除されます。 2行目では、no空白以外で始まるか、空の場合はその行を文字列に置き換え、空白で始まるyes場合は文字列に置き換えます。これはエクスポートyesできます。no

関連情報