【问题标题】:awk concatenate next lines when matchingawk 匹配时连接下一行
【发布时间】:2014-02-06 08:09:40
【问题描述】:

我正在使用 awk 分析文本文件并将匹配正则表达式的行与以下行连接起来。我正在使用以下命令:

awk '/^ [0-9]/{printf $0 ;next;}1' *filename*

当我从提示符测试它时,它按预期工作,但是当我将相同的命令放在 bash 脚本中时,输出与输入文件相同。

知道为什么这不能在 bash 脚本中工作吗?

更新

这是完整的脚本:

#!/bin/bash
#

for FILE in $( ls *.raw )
do
    awk '/^ [0-9]/{printf $0 ;next;}1' FILE > temp
done

我尝试按照@Kent 的建议使用awk '/pattern/{printf "%s",$0;next}1' file,但它只会在文件开头添加 %s。

已解决

我修改了命令以使用 getline 将匹配行与以下两行连接起来,如下所示:

(awk '/^ [0-9]/{l1=$0;getline;l2=(l1  $0);getline; print l2 $0}' < input_file) > output_file

【问题讨论】:

  • 更好的方法:awk '/pattern/{printf "%s",$0;next}1' file 并且你必须显示你的 bash 代码,否则没人能是什么问题。
  • set -x # 进行调试,看看它在执行时有什么。
  • awk '/^ [0-9]/{printf $0 ;next;}1' *filename* 每当找到模式时,它会打印没有"\n" 的行,因为您正在使用printf,如果找不到模式,则将打印行,因为您使用了1,即}1' *filename* , 正如 Kent 所说,您应该清楚地描述您的要求。
  • 永远不要使用printf $0,因为当$0 包含printf 格式化字符(如%)时,它会神秘地失败。正如@Kent 告诉你的那样,改用printf "%s", $0

标签: regex linux bash shell awk


【解决方案1】:

我修改了命令,使用 getline 将匹配行与以下两行连接起来,如下所示:

(awk '/^ [0-9]/{l1=$0;getline;l2=(l1  $0);getline; print l2 $0}' < input_file) > output_file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2017-04-30
    • 2014-11-02
    • 2017-12-16
    • 2021-12-06
    • 2021-09-05
    • 2018-01-09
    相关资源
    最近更新 更多