【问题标题】:awk: print first line of file before reading linesawk:在读取行之前打印文件的第一行
【发布时间】:2014-04-12 15:49:05
【问题描述】:

在我开始使用 awk 遍历每一行之前,我将如何打印给定输入的第一行?

假设我想运行命令ps aux 并返回我正在搜索的列标题和特定模式。过去我这样做过:

ps aux | ggrep -Pi 'CPU|foo' 

CPU 是我知道将在输入的第一行中的值,因为它是列标题之一,foo 是我实际搜索的特定模式。

我发现了一个 awk 模式,它会拉出第一行:

awk 'NR > 1 { exit }; 1'

这是有道理的,但在对其余输入进行模式匹配之前,我似乎无法弄清楚如何触发它。我想我可以把它放在 awk 命令的BEGIN 部分,但这似乎不起作用。

有什么建议吗?

【问题讨论】:

  • grep 有问题吗?对于这项任务,它比 awk 更有意义。
  • 我不明白你想要什么。如果 awk 读取了您的第一行,它已经开始读取您的文件的行。
  • @hek2mgl,我在 grepping 时遇到的问题是,我用于匹配的列标题恰好出现在第一行以外的某些输出中,例如如果我使用 PID grep 来获取标题,如果我使用 -i 标志进行 grep,有时它会返回带有 pid 模式的进程行。另外,我正在尝试更多地了解 awk。 @Kent,我想要的是 awk 的输出,它始终包含第一行,然后还包含与我匹配的模式匹配的其余行。

标签: bash awk


【解决方案1】:

使用以下 awk 脚本:

ps aux | awk 'NR == 1 || /PATTERN/'

如果当前行是输出中的第一行或包含模式,则打印当前行。

顺便说一句,使用sed 可以达到相同的结果:

ps aux | sed -n '1p;/PATTERN/p'

【讨论】:

  • 简单的解决方案。我认为你可以放弃这两个.*——它们只会增加混乱
  • 完美。谢谢@hek2mgl,这正是我想要的。
  • @HenkLangeveld 是的,这确实是不必要的混乱。感谢您指出这一点
【解决方案2】:

解释 awk BEGIN

我想我可以把它放在 BEGIN 部​​分...

在awk 中,可以有多个BEGIN 子句。这些按顺序执行 在 awk 开始从stdin 读取。

【讨论】:

  • 我不明白你为什么在这种情况下提到BEGIN 子句。你能详细说明一下吗? (似乎我错过了什么)
  • 我现在引用了触发此响应的短语。这就是这个问题的全部内容。您的回答涉及核心问题。
【解决方案3】:

如果您想读入BEGIN 操作的第一行,您可以使用getline 读入,处理它并丢弃该行,然后再继续执行 awk 命令的其余部分。这是“介入”,但如果您先解析标题或其他内容,可能会有所帮助。

#input.txt
Name    City
Megan   Detroit
Jackson Phoenix
Pablo   Charlotte

awk 'BEGIN { getline; col1=$1; col2=$2; } { print col1, $1; print col2, $2 }' input.txt

# output
Name Megan
City Detroit
Name Jackson
City Phoenix
Name Pablo
City Charlotte

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2022-06-10
    • 1970-01-01
    • 2022-01-16
    • 2013-02-04
    • 2014-03-24
    相关资源
    最近更新 更多