我正在创建一个脚本,用于检查输出文件第二行中的第一个字符是否为“”(是否为空)。如果它是空白的,我想回显“是”,如果不回显“否”。我现在正在尝试这个。测试文件包含以下内容:
###############
#
# #############
# #
# ######### # #
# # # #
# ### ##### # #
# # # # #
# # ###########
# #
###############
我的代码是:
#!/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
- 个字符的子串;所以我们检查一行的第一个字符是否是空格“ ”打印“是”否则“否”(我们用三元运算符检查,条件?“if-true”:“if-false”)。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
将被输出。