【问题标题】:Unix Command Operations [duplicate]Unix命令操作[重复]
【发布时间】:2016-09-09 07:18:30
【问题描述】:

假设在 linux 中有一个文件,其中包含以空格分隔的行。

例如

This is linux file
This is linux text
This is linux file 1
This is linux file 3

现在我只想打印文件行中存在第 5 列的那些行。在这个例子中,我的输出应该是第 3 行和第 4 行(第 1 行和第 3 行是第 5 列)

最好的方法是什么?

【问题讨论】:

  • 当这个问题没有提及或请求帮助 awk 时,为什么这个问题被标记为重复请求 awk 的帮助?

标签: linux unix


【解决方案1】:

这可以通过awk 及其NF(字段数)变量来完成,具体如下:

pax$ cat inputFile 
This is linux file
This is linux text
This is linux file 1
This is linux file 3

pax$ awk 'NF >= 5 {print}' inputFile 
This is linux file 1
This is linux file 3

这是因为awk 命令的基本形式是pattern { action }

模式选择符合特定标准的行(有时不是行的行,例如BEGINEND 模式)并且操作决定了要做什么。

在这种情况下,它会选择具有五个或更多字段的行并简单地打印它们。

【讨论】:

  • 由于默认操作是print,因此可以简化为awk 'NF >= 5'
  • 非常感谢 Pax!
【解决方案2】:

除了awk,您还可以在 bash(或任何 shell)中非常简单地执行此操作,方法是将每行读入至少五个字段,然后检查以确保填充第五个字段。这样的东西会起作用(它将从作为第一个参数给出的文件名中读取(或stdin,如果没有给出名称))

#!/bin/bash

fn="${1:-/dev/stdin}"

while read -r f1 f2 f3 f4 f5; do
    [ -n "$f5" ] && printf "%s %s %s %s %s\n" "$f1" "$f2" "$f3" "$f4" "$f5"
done <"$fn"

示例

使用您的数据,上面的 sn-p 产生以下输出:

$ bash prn5flds.sh dat/5fields.txt
This is linux file 1
This is linux file 3

(注意:根据您的 shell,read 可能支持也可能不支持 -r 选项。如果不支持,请忽略它)

【讨论】:

  • 谢谢大卫,这行得通!
  • 很高兴为您提供帮助。奇怪的是,当您的问题没有提及或请求awk 的帮助时,您的问题被标记为请求awk 帮助的问题的重复。去图...
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 2014-08-05
  • 2012-05-13
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
相关资源
最近更新 更多