아 공백을 제거해

아 공백을 제거해

출력 파일의 두 번째 줄에 있는 첫 번째 문자가 ""인지(비어 있는지) 확인하는 스크립트를 만들고 있습니다. 비어 있으면 "예"를, 그렇지 않으면 "아니요"를 에코하고 싶습니다. 나는 지금 이것을 시도하고 있습니다. 테스트 파일에는 다음 내용이 포함되어 있습니다.

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

내 코드는 다음과 같습니다


#!/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가 "" 대신 "#"과 동일하게 끝나기 때문입니다.

두 번째 줄의 첫 번째 문자가 ""인지 테스트하는 다른 더 좋은 방법이 있습니까?

답변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)를 확인합니다. " ": "거짓인 경우").si


비슷한 질문에 답하려면(파일 끝에서 두 번째 줄과 줄의 마지막 문자를 확인하세요):

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으로 설정하고, 두 번째에서 마지막 행의 경우 1로 설정합니다.

답변3

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

두 번째 행을 제외한 모든 행이 삭제됩니다. 두 번째 줄에서 no공백이 아닌 것으로 시작하거나 비어 있는 경우 해당 줄을 문자열로 바꾸고, yes공백으로 시작하는 경우 문자열로 바꿉니다. 이것은 내보낼 yes수 있습니다.no

관련 정보