출력 파일의 두 번째 줄에 있는 첫 번째 문자가 ""인지(비어 있는지) 확인하는 스크립트를 만들고 있습니다. 비어 있으면 "예"를, 그렇지 않으면 "아니요"를 에코하고 싶습니다. 나는 지금 이것을 시도하고 있습니다. 테스트 파일에는 다음 내용이 포함되어 있습니다.
###############
#
# #############
# #
# ######### # #
# # # #
# ### ##### # #
# # # # #
# # ###########
# #
###############
내 코드는 다음과 같습니다
#!/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)를 확인합니다. " ": "거짓인 경우").s
i
비슷한 질문에 답하려면(파일 끝에서 두 번째 줄과 줄의 마지막 문자를 확인하세요):
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