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

Keep desired data and remove unwanted one

我有一个包含数千行和几列的大文件,我只想保留 0, 1, -1, 2 第 2 列开始 并希望删除所有其他数字 (6|6, 3|3, 4|4,7|7, e.t.c.).

输入:

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),但不幸的是无法解决这个问题,非常感谢您的帮助。

下面这个简单的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]+/ 如果一行没有 [=38=,则检查这里的条件]digit|(pipe)digit 如果条件不为真则打印该行(awk 在条件方法和操作上工作,所以这里当条件为真时我是没有提及任何操作,因此将发生当前行的默认操作打印。)

解决方案 2: 解决方案 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: 是一个正则表达式,我在这里检查一行是否有 digit|digit 然后使用 d 选项到 delete/skip 该行。 p:如果任何一行都不满足先前的条件,则打印该行,因为它不会有 digit|digit行。

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

grep -v '|' input_file

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