【问题标题】:Get the last two letters of each line in a file using script shell使用脚本外壳获取文件中每行的最后两个字母
【发布时间】:2019-11-26 16:35:27
【问题描述】:

我有一个包含 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/'

【问题讨论】:

标签: linux bash shell awk


【解决方案1】:

根据您的文件布局

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

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

【讨论】:

  • 这似乎是最有效的。
【解决方案2】:

您可以使用单个命令awk:

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

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

【讨论】:

  • 可以这样改进:awk ' $NF !="AA" {exit 1}' ad.txt && echo "good" ||回声“坏”
  • @yoga:我最初是这么想的,但只有在最后两个字符之前有空格时才有可能。 OP 的示例显示了这一点,但没有提及。
  • 那个或 jww 都在附近并且不喜欢这个问题,所以无论技术正确性如何,所有答案都被否决了。
  • 根据 OP 的示例,这也可以工作并对其进行测试。顺便说一句,我没有投反对票。
【解决方案3】:

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

if egrep -q -v AA$ input.txt; then echo "bad"; else echo "good";fi

【讨论】:

    【解决方案4】:

    此脚本应与 awk 一起使用。我的txt文件名是.test你可以改成你的文件名。

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

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

    【讨论】:

    • 每次都打印“这很糟糕”。
    • 你填充 .test 文件吗?
    • 是的,我做到了。我认为这是 awk 命令,我看不到它在哪里提取每行的最后两个字符?
    • awk 默认按空格分割行,因此使用{ print $2 } 它会提取第二列。试试cat .test | awk '{ print $2 }'看看
    • 还有 UUOc不必要地使用 catawk '{print $2}' .test | ... 而不是 cat .test | awk '{print $2}' .test | ...(任何时候使用 cat,如果你实际上并没有连接文件,很有可能它是一个UUOc)
    【解决方案5】:

    grepwc 的解决方案:

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

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

    【讨论】:

    • 我不是您的反对意见,但我怀疑您的反对意见是由于使用 ==(字符串比较,对于字符串应该正确地为 =)而不是使用 -eq数值比较。此外,不要将 反引号 用于 命令替换,而应使用 $(...)。您的意图似乎是 if [ $(grep -v 'AA$' file | wc -l) -eq 0 ]; then echo good; else echo bad; fi,虽然有效产生不少于 4 个子shell。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多