awk 去除空格

awk 去除空格

我正在创建一个脚本,用于检查输出文件第二行中的第一个字符是否为“”(是否为空)。如果它是空白的,我想回显“是”,如果不回显“否”。我现在正在尝试这个。测试文件包含以下内容:

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

我的代码是:


#!/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”)。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如果以空格开头,则用字符串替换该行。这yesno将被输出。

相关内容