1

我有一个包含20行的 .txt 文件,并且希望得到每行的最后两个字母。它在每一行中都等于AA,然后打印Good。如果没有,请打印Bad

line11111111111111111 AA
line22222222222222222 AA
line33333333333333333 AA
..................... 
line20202020202020202 AA

很好

============================

line11111111111111111 AB
line22222222222222222 AC
line33333333333333333 WD
..................... 
line20202020202020202 ZZ

这很糟糕

这样做但需要改进:sed 's/^.*\(.\{2\}\)/\1/'

4

5 回答 5

2

根据您的文件布局

$ awk '$NF!="AA"{f=1; exit} END{print (f?"BAD":"GOOD")}' file

请注意,您不必检查第一个非“AA”令牌之后的其余部分。

于 2019-07-17T19:39:19.780 回答
1

您可以使用单个命令awk

awk 'substr($0, length()-1) != "AA"{exit 1}' file && echo "GOOD" || echo "BAD"

substr($0, length()-1)将提取每行的最后 2 个字符。如果我们在任何行中1都不正常, awk 命令将退出。AA

于 2019-07-17T19:18:12.887 回答
0

该脚本应与 awk 一起使用。对我来说 txt 文件的名称是.test你可以用你的文件名来改变它。

if [ "$(awk '{ print $2 }' .test | uniq)" = "AA" ]; then 
  echo "This is GOOD"; 
else echo "This is BAD";
fi

它是如何工作的:awk '{ print $2 }'首先,awk 用于通过使用命令 获取第二列,uniq我们从每一行获取唯一的条目。如果所有行都是 AA uniq,则它只有 1 行。最后我们检查最后一个产品是否只有“AA”(1行字符串和2 As)。

于 2019-07-17T19:15:45.853 回答
0

使用grep反转匹配来识别不以 "AA" 结尾的行:

if egrep -q -v AA$ input.txt; then echo "bad"; else echo "good";fi
于 2019-07-17T19:58:24.087 回答
-1

解决方案grepwc

if [ "`grep -v 'AA$' your-file-here | wc -l`" == "0" ] ; then echo 'GOOD' ; else echo 'BAD' ; fi

grep命令检查所有不以结尾的行AAwc计算行数。

于 2019-07-17T19:26:28.227 回答