使用awk过滤文本文件中的数据

时间:2018-12-12 14:16:14

标签: awk

我正在尝试根据大文本文件中的一列过滤行。这是一个小例子:

example

-3261   1
777 1
-45574  1
1017    1
-2802   1
969 1
1800    1
-128768 1
-7614   1
-136751 1
-64104  1
134844  1

我想根据第一列进行过滤。如果第一列中的数字小于4000或大于-4000,则保留该行并滤除其余部分。这是预期的输出:

expected output

-3261   1
777 1
1017    1
-2802   1
969 1
1800    1

我正在使用awk并使用以下代码:

awk -F "\t" '{ if($1 >= -4000 || $1 <= 4000) { print } }' infile.txt > outfile.txt

使用此代码输出与输入文件相同。你知道如何解决吗?

3 个答案:

答案 0 :(得分:2)

首先,您应该知道

  

小于4000 大于-4000

  

小于4000 AND 大于-4000

是不同的。

-80000OR条件有效,但对第二个条件无效。我希望你的意思是对的。根据您的要求( OR 一个),您可以执行(遵循您的“或”要求):

awk '$1>=-4000 || $1<=4000'   file

请注意,这将首先检查>=-4000,即在输出中具有值99999999的行将是有效的。

如果您的意思是 AND 条件,则需要:

awk '$1<4000 && $1>-4000' file

答案 1 :(得分:2)

另一种写法

$ awk '$1^2 <= 4000^2' input_file

答案 2 :(得分:1)

请您尝试以下。

awk '$1<4000 && $1>-4000'   Input_file

您的代码出了问题,您需要放置&&条件,因为您想将两个条件都检查为TRUE。 ||条件还将在任何条件也为TRUE的情况下打印那些元素。

有关&&页上的||man awk运算符的更多信息:

   The &&, ||, and !  operators are logical AND, logical OR, and logical NOT, respectively, as in C.  They do short-circuit evaluation,
     

也如          C和用于组合更多原始模式表达式。与大多数语言一样,括号可以用来更改   评估顺序