保留所需数据并删除不需要的数据

时间:2018-01-25 10:38:45

标签: awk delete-row

我有一个包含数千个行和列的大文件,我想只保留 0,1,-1, 第2列以后并希望获得摆脱所有其他数字( 6 | 6,3 | 3,4 | 4,7 | 7等)。

输入:

1 55 -1 6|6 0 0 -1 1 2 0

1 56 -1 0 1 0 1 -1 -1 2 0 

1 63 3|3 -1 0 0 1 -1 -1 2

1 73 -1 2 0 1 -1 -1 -1 0 

1 75 -1 0 0 0 7|7 -1 -1 4|4 -1

1 80 -1 0 0 0 -1 5|5 -1 0 0 

1 83 -1 1 1 0 -1 -1 -1 -1

输出:

1 56 -1 0 1 0 1 -1 -1 2 0 

1 73 -1 2 0 1 -1 -1 -1 0 

1 83 -1 1 1 0 -1 -1 -1 -1

我尝试了各种选项( sed,awk,grep ),但遗憾的是无法解决此问题,我们将非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您也可以通过以下方式获得相同的输出:

grep -v '|' input_file

它适用于您的特定示例,但不如awk解决方案强大。

答案 1 :(得分:2)

以下简单的awk可能对您有帮助。

awk '!/[0-9]+\|[0-9]+/'  Input_file

输出如下。

1 56 -1 0 1 0 1 -1 -1 2 0
1 73 -1 2 0 1 -1 -1 -1 0
1 83 -1 1 1 0 -1 -1 -1 -1

说明: !/[0-9]+\|[0-9]+/检查条件,如果某行没有 数字|(管道)数字 < / strong>如果不是条件为TRUE则打印该行(awk对条件方法起作用然后动作,所以这里当条件为TRUE时我没有提及任何动作,因此将发生当前行的默认动作打印。 )

解决方案第二: 解决方案sed此处也是:

sed -n -E '/[0-9]+\|[0-9]+/d;p'   Input_file

<强> 说明: -n:停止sed的打印,直到我们明确提到按p选项打印任何行。 -E:用于:

   -e script, --expression=script
          add the script to the commands to be executed

/[0-9]+\|[0-9]+/d:这是一个正则表达式,我在这里检查一行是否有 数字 然后使用d选项删除/跳过那条线。 p:如果在任何行中不满足先前条件,则打印该行,因为该行中不会有 数字