【问题标题】:Skip rows based on date check from a STDOUT in shell根据 shell 中 STDOUT 的日期检查跳过行
【发布时间】:2020-10-19 13:02:05
【问题描述】:

我正在运行一个 shell 脚本,在该脚本下我正在运行在 STDOUT 上写入输出数据的程序,并从那里捕获输出并将其重定向到文件中。 但是该程序写入了很多数据,当我将其写入文件时需要过滤掉这些数据

test -d $data | grep "^[A-Z]*|[0-9]*" >> $OUT_FILE

现在在第 3 行的此输出中,我得到一个值,我想检查该值是否小于 43564,然后跳过该行。

test -d $data | grep "^[A-Z]*|[0-9]*" | awk -F "|" 'if($3 >= 43564){print $0}'>> $OUT_FILE

但这对我不起作用,建议我做错了什么

【问题讨论】:

  • test -d "$data" 不向标准输出写入任何内容,因此grep 没有任何内容可供读取。

标签: shell unix awk


【解决方案1】:

您能否尝试以下操作,因为没有提供样品,因此无法测试。作为一项重要更改,您需要在awk 条件下将=> 更改为>=。然后我还修复了您的if 条件,理想情况下if 条件应该在{if(your condition)....} 大括号内。

实际上我们不需要if条件,我们可以简单地运行条件本身,也不需要提及print函数,因为awk适用于regexp/condition的方法然后action所以如果这个条件为 TRUE 它将打印该行(因为没有提及任何操作,awk 的默认操作正在打印当前行)。

根据@chepner 评论评论test -d 没有向标准输出写入任何内容,因此现在将其更改为条件。

if [[ test -d $data ]]
then
     awk -F "|" '/^[A-Z]*|[0-9]*/ && ($3 >= 43564)' Input_file > $OUT_FILE
else
     echo "Please check $data directory NOT present."
fi

注意:我们需要将grepawk 一起使用,因为awk 能够检查正则表达式,因为这是OP 的工作,我打算这样做OP 在这里尝试修复。

【讨论】:

  • 感谢=> 修复;无耻地将其复制到我的答案中。 +1
  • 我希望如此。我自己错过了它,但认为我们的答案不同,值得保留。
  • 看了答案后,我意识到我的方法不正确。
【解决方案2】:

你不能greptest 的输出,因为它不打印任何东西。

也许你想要

test -d "$data" ||
awk -F "|" '/^[A-Z]*|[0-9]*/ && $3 >= 43564' "$data" >> "$OUT_FILE"

相当于对初学者更友好

if ! [ -d "$data" ]; then
   awk -F "|" '/^[A-Z]*|[0-9]*/ && $3 >= 43564' "$data" >> "$OUT_FILE"
fi

您几乎不想将grep 传递给Awk;这是一个非常次要的反模式,但也很容易避免。请参阅useless use of grep. 有点类似,{print $0} 已经是 Awk 中的默认操作,因此我们可以简单地将其省略,只需指定何时打印的条件。

如果您不想在then 部分检查文件$data,显然将该部分替换为您要过滤的文件的名称。 (另请注意proper quoting.)如果您正在过滤标准输入,您可以非常好地取出文件名并管道到整个if 表达式。

some complex process which generates this output |
if ! [ -d "$data" ]; then
    awk -F "|" '/^[A-Z]*|[0-9]*/ && $3 >= 43564'
fi >>"$OUT_FILE"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多