我正在尝试根据大文本文件中的一列过滤行。这是一个小例子:
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
使用此代码输出与输入文件相同。你知道如何解决吗?
答案 0 :(得分:2)
首先,您应该知道
小于4000 或大于-4000
和
小于4000 AND 大于-4000
是不同的。
-80000
对OR
条件有效,但对第二个条件无效。我希望你的意思是对的。根据您的要求( 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和用于组合更多原始模式表达式。与大多数语言一样,括号可以用来更改 评估顺序