根据值删除bash中的行

时间:2017-10-24 00:26:10

标签: bash shell awk

我有一个这样的文件:

true

我想修剪此文件:删除第二列中包含值的行< 1000.修剪后,文件应如下所示:

1 4014 1.97676  1   1
1 4014 1.97676  2   1
1 4014 1.97676  3   1
1 2014 1.97676  4   1
1 2014 1.97676  5   1
1 401 1.97676  6   1
1 401 1.97676  7   1
1 401 1.97676  8   1
1 14 1.97676  9   1
1 14 1.97676  10  1

如何在bash中实现这一目标?我不想在python中特别是在pandas中这样做,因为它们处理大文件的速度很慢。

另一个问题是:如何在.sh文件中编写这样的bash命令(类似于python运行的.py文件)并在终端中运行文件,如下所示:

1 4014 1.97676  1   1
1 4014 1.97676  2   1
1 4014 1.97676  3   1
1 2014 1.97676  4   1
1 2014 1.97676  5   1

非常感谢。

这是我想做的事情:

文件是这样的:

$bash clean_file.sh inputfile.txt > outputfile.txt

我想使用以下步骤清理它:

NODE_1_length_4014_cov_1.97676  1   1
NODE_1_length_4014_cov_1.97676  2   1
NODE_1_length_4014_cov_1.97676  3   1
NODE_1_length_4014_cov_1.97676  4   1
NODE_1_length_4014_cov_1.97676  5   1
NODE_1_length_4014_cov_1.97676  6   1
NODE_1_length_4014_cov_1.97676  7   1
NODE_1_length_4014_cov_1.97676  8   1
NODE_1_length_4014_cov_1.97676  9   1
NODE_1_length_4014_cov_1.97676  10  1

我没有添加' inputfile'和' outputfile'在上面的脚本中,因为每个步骤都使用前一步的输出文件作为输入文件。我不知道如何将这三个步骤合并到一个脚本文件中并将其保存在硬盘中。我想在终端中运行它,以便存储在我计算机中不同位置的文件。

非常感谢!

3 个答案:

答案 0 :(得分:1)

bash是错误的工具。

awk '$2 >= 1000 { print }'

答案 1 :(得分:1)

这种过滤对于awk来说确实微不足道,但仅仅为了完整性(教育),这里只有bash - 版本:

#!/bin/bash

# "parse"/validate a script's argument (filename)
if [[ ! -e "$1" ]]; then
    echo "Usage: $0 FILE"
    exit
fi

# iterate over lines, splitting into fields on whitespaces
while read -ra fields; do
    (( fields[1] >= 1000 )) && echo "${fields[@]}"
done <"$1"

用法如下:

$ ./clean_file.sh inputfile.txt > outputfile.txt

答案 2 :(得分:0)

您的第二个示例输入文件没有任何测试条件。所以我更新了

  def authenticate(actorRef: ActorRef, message: SocketParsedMessage) {
    (message.data \ "token").validate[String] match {
      case s: JsSuccess[String] => {
        val token = jwt.parse(s.get)
        if (jwt.verify(token,jwtSecret)) {
          val userId = UUID.fromString(jwt.getSubject(token))
          hashMapU2A += (UUID.fromString(jwt.getSubject(token)) -> actorRef)
          hashMapA2U += (actorRef -> userId)
          actorRef ! SocketParsedMessage(AllowedSocketMessageTypes.AUTHENTICATE, Json.obj(
            "success" -> true, "message" -> "Authorized for making further requests request")).toString
          publishUserStatus(userId)
        } else {
          actorRef ! SocketParsedMessage(AllowedSocketMessageTypes.AUTHENTICATE, JsObject(
            Seq("success" -> JsBoolean(false), "message" -> JsString("Invalid token"))
          )).toString
        }
      }
      case e: JsError => {
        actorRef ! SocketParsedMessage(AllowedSocketMessageTypes.AUTHENTICATE, Json.obj(
          "success" -> false, "message" -> "Token not supplied with request")).toString
        actorRef ! PoisonPill
      }
    }
  }



val hashMapA2U: mutable.HashMap[ActorRef, UUID] = mutable.HashMap()

它变成了

$ sed -i '5,$s/4014/300/' file

您要删除长度小于500的条目。这个简单的NODE_1_length_4014_cov_1.97676 1 1 NODE_1_length_4014_cov_1.97676 2 1 NODE_1_length_4014_cov_1.97676 3 1 NODE_1_length_4014_cov_1.97676 4 1 NODE_1_length_300_cov_1.97676 5 1 NODE_1_length_300_cov_1.97676 6 1 NODE_1_length_300_cov_1.97676 7 1 NODE_1_length_300_cov_1.97676 8 1 NODE_1_length_300_cov_1.97676 9 1 NODE_1_length_300_cov_1.97676 10 1 脚本可以执行!

awk