Awk 删除“;0“;或;1“;从每行末尾开始,第一行除外

Awk 删除“;0“;或;1“;从每行末尾开始,第一行除外,awk,sed,Awk,Sed,输入文件如下所示 Kick-off team 68 0 Ball safe 69 1 Attack 77 8 Attack 81 4 Throw-in 83 0 Ball possession 86 3 Goal kick 100 10 Ball possession 101 1 Ball safe 114 13 Throw-in 123 9 Ball safe 134

输入文件如下所示

Kick-off team   68  0
Ball safe       69  1
Attack          77  8
Attack          81  4
Throw-in        83  0
Ball possession 86  3
Goal kick       100 10
Ball possession 101 1
Ball safe       114 13
Throw-in        123 9
Ball safe       134 11
Ball safe       135 1
Ball safe       137 2
最后应该是这样的:

Kick-off team   68  0
Attack          77  8
Attack          81  4
Ball possession 86  3
Goal kick       100 10
Ball safe       114 13
Throw-in        123 9
Ball safe       134 11
Ball safe       137 2
我的解决办法是

awk '{print $NF}' test.txt | sed -re '2,${/(^0$|^1$)/d}'
如何直接更改文件,例如sed-i

sed -i '2,$ {/[^0-9][01]$/d}' test.txt
  • 2,$
    要执行的行,这一行表示文件末尾的第二行
  • {/[^0-9][01]$/d}
    从筛选的行中,删除以
    0
    1
    • 如果最后一列之前的字符始终是空格,则也可以使用${/[01]$/d}

使用更适合列操作的
awk

awk 'NR==1 || ($NF!=1 && $NF!=0)' test.txt > tmp && mv tmp test.txt
  • NR==1
    第一行
  • ($NF!=1&&$NF!=0)
    最后一列不应是
    0
    1
    • 如果最后一列只有非负数,也可以使用
      $NF>1
  • >tmp&&mv tmp test.txt
    将输出保存到临时文件,然后将其作为原始文件移回
  • 使用
    GNU awk
    ,有一个inplace选项
    awk-i inplace'NR==1 | |($NF!=1&&$NF!=0)'test.txt
  • 2,$
    要执行的行,这一行表示文件末尾的第二行
  • {/[^0-9][01]$/d}
    从筛选的行中,删除以
    0
    1
    • 如果最后一列之前的字符始终是空格,则也可以使用${/[01]$/d}

使用更适合列操作的
awk

awk 'NR==1 || ($NF!=1 && $NF!=0)' test.txt > tmp && mv tmp test.txt
  • NR==1
    第一行
  • ($NF!=1&&$NF!=0)
    最后一列不应是
    0
    1
    • 如果最后一列只有非负数,也可以使用
      $NF>1
  • >tmp&&mv tmp test.txt
    将输出保存到临时文件,然后将其作为原始文件移回
  • 使用
    GNU awk
    ,有一个inplace选项
    awk-i inplace'NR==1 | |($NF!=1&&$NF!=0)'test.txt

    • 以下是我对此的看法

      sed -i.bak -e '1p;/[^0-9][01]$/d' file.txt
      
      sed脚本打印第一行,然后删除与您描述的模式匹配的所有后续行。这假设您的第一行是要删除的候选行;如果最后一个字段中包含0或1以外的内容,此脚本将打印两次。
      -i
      选项告诉sed就地编辑(使用备份文件)

      Awk没有用于就地编辑文件的等效选项——如果您想要这种功能,您需要在Awk脚本周围的shell包装中实现它,正如@sundeep所建议的那样


      请注意,我没有使用GNU-sed,但是这个命令应该同样适用于它。

      以下是我对此的看法

      sed -i.bak -e '1p;/[^0-9][01]$/d' file.txt
      
      sed脚本打印第一行,然后删除与您描述的模式匹配的所有后续行。这假设您的第一行是要删除的候选行;如果最后一个字段中包含0或1以外的内容,此脚本将打印两次。
      -i
      选项告诉sed就地编辑(使用备份文件)

      Awk没有用于就地编辑文件的等效选项——如果您想要这种功能,您需要在Awk脚本周围的shell包装中实现它,正如@sundeep所建议的那样

      请注意,我没有使用GNU-sed,但是这个命令应该同样适用于它。

      这可能适用于您(GNU-sed):

      除第一行外,删除以
      0
      1
      结尾的任何行。这可能适用于您(GNU-sed):


      除第一行外,删除以
      0
      1
      结尾的任何行,以便救援

      $ awk 'NR==1 || $NF && $NF!=1' file
      
      或者更神秘

      $ awk 'NR==1 || $NF*($NF-1)' file
      

      awk
      救援

      $ awk 'NR==1 || $NF && $NF!=1' file
      
      或者更神秘

      $ awk 'NR==1 || $NF*($NF-1)' file
      

      这离我的很近。我会用这个。谢谢你,你可以用
      $NF!~/^[01]$/
      @JamesBrown是的,但是如果比较有效,为什么要使用regex;)@Sundeep保存字节时,它们不会在树上生长;D@JamesBrown,数字比较的处理速度比正则表达式快。保存字节或CPU周期更好?这和我的差不多。我会用这个。谢谢你,你可以用
      $NF!~/^[01]$/
      @JamesBrown是的,但是如果比较有效,为什么要使用regex;)@Sundeep保存字节时,它们不会在树上生长;D@JamesBrown,数字比较的处理速度比正则表达式快。最好是保存字节,或者CPU周期?这个问题已经解决了。谢谢你的建议!这个问题解决了。谢谢你的建议!太棒了,很高兴我能帮忙!:-)如果这个答案最适合你,请随意点击答案左侧的复选标记。太棒了,很高兴我能帮上忙!:-)如果这个答案最适合你,请点击答案左侧的复选标记。