删除" 0"或" 1"从第一行开始,每行结束

时间:2017-02-13 09:10:37

标签: 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 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?

4 个答案:

答案 0 :(得分:2)

sed -i '2,$ {/[^0-9][01]$/d}' test.txt
  • 2,$行动作,这一行说第二行到文件结尾
  • 来自过滤行的
  • {/[^0-9][01]$/d},删除以01结尾的行
      如果最后一列之前的字符始终是空格,也可以使用
    • '2,$ {/ [01]$/d}'


使用awk更适合列操作:

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

答案 1 :(得分:1)

这是我对此的看法。

sed -i.bak -e '1p;/[^0-9][01]$/d' file.txt

sed脚本打印第一行,然后删除与您描述的模式匹配的所有后续行。这假设你的第一行是候选删除;如果它在最后一个字段中包含0或1以外的内容,则此脚本将打印两次。 -i选项告诉sed就地编辑(使用备份文件)。

Awk没有用于就地编辑文件的等效选项 - 如果你想要这种功能,你需要在你的awk脚本的shell包装器中实现它,就像@sundeep建议的那样。

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

答案 2 :(得分:1)

awk救援!

$ awk 'NR==1 || $NF && $NF!=1' file

或更隐蔽

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

答案 3 :(得分:0)

这可能适合你(GNU sed):

mPic.setImageURI(null);
mPic.setImageURI(photoUrl);

除第一行外,删除以sed -i '1b;/\s[01]$/d' file 0结尾的所有行。