【问题标题】:AWK - how to selectively modify txt fileAWK - 如何有选择地修改 txt 文件
【发布时间】:2012-12-13 17:04:08
【问题描述】:

我想打印每条记录的特定第二个字段(匹配正则表达式)

awk '$2 ~ /regex1/'

但是,只有在 regex2 和 regex3 之间的特定记录

awk '/regex2/,/regex3/'

其他不在regex2和regex3之间的记录应该正常打印(所有字段)

有什么想法,如何组合?

输入和输出的快速示例:

输入

parrot   milana  3 ukraine
dog      husky   1 poland
cat      husky   5 france
elephant malamut 5 belgium
bird     husky   5 turkey

输出:(给我看

parrot   milana  3 ukraine
dog      husky   1 poland
         husky            
elephant malamut 5 belgium    
bird     husky   5 turkey
  1. 显示整个输入但是:
  2. 在 /dog/ 和 /elephant/ 之间(显示这些记录不变)仅显示第二个字段,它与正则表达式 /husky/ 匹配

希望对你有用……

【问题讨论】:

  • 您能否用示例输入数据和所需的输出数据说明您的需求。祝你好运。

标签: awk


【解决方案1】:

这个:

awk '/regex2/,/regex3/'

是简写

awk '/regex2/{f=1} f; /regex3/{f=0}'

恕我直言不应该使用速记版本,因为它的简洁性不值得你尝试使用其他标准构建它时引入的困难,例如不打印起始行和/或不打印结束行和/或引入其他 RE 以在该范围内匹配,就像您现在所做的那样。

鉴于此,您将从以下脚本开始:

awk '/dog/{f=1} f; /elephant/{f=0}'

并且您只想打印找到“husky”的行,所以这是简单而明显的调整:

awk '/dog/{f=1} f && /husky/; /elephant/{f=0}'

编辑:响应更改的要求,并使用制表符分隔的文件:

$ cat file
parrot  milana  3       ukraine
dog     husky   1       poland
cat     husky   5       france
elephant        malamut 5       belgium
bird    husky   5       turkey

$ awk '
BEGIN{ FS=OFS="\t" }
/elephant/ {f=0}
{
   if (f) {
      if ($2 == "husky") {
         print "", $2
      }
   }
   else {
      print
   }
}
/dog/      {f=1}
' file
parrot  milana  3       ukraine
dog     husky   1       poland
        husky
elephant        malamut 5       belgium
bird    husky   5       turkey

你可以写的更简洁:

$ awk '
BEGIN{ FS=OFS="\t" }
/elephant/ {f=0}
f && /husky/ { print "", $2 }
!f
/dog/      {f=1}
' file
parrot  milana  3       ukraine
dog     husky   1       poland
        husky
elephant        malamut 5       belgium
bird    husky   5       turkey

但我认为 if-else 语法对于 awk 的新手来说是最清晰和最容易修改的。如果您想要不同的输出格式,请在手册中查找“printf”。

【讨论】:

  • Ed,这对我帮助很大,但这几乎是我需要的,如何修改输出,以便在输出中打印狗和大象记录(所有字段)并显示猫记录(但只有第二个字段)顺便说一句:有没有好的 awk 教程链接?
  • 对不起,我不明白这个问题,请更新您发布的问题以显示您正在寻找的输出。要学习 awk,请购买 Arnold Robbins 所著的《Effective Awk Programming, Third Edition》一书,并在所有 awk 专家闲逛的网络新闻 comp.lang.awk 中潜伏。通过阅读他们对问题的回答,您可以学到很多东西。您也可以在 awk.info 上闲逛,但那里发布的一些内容对于 awk 来说并不是理想的应用程序,因此请谨慎对待它们。
  • 我刚刚编辑了我的问题,我希望它足够清楚。感谢文献推荐!
  • 你想对狗和大象之间不包含哈士奇的记录做什么?更新您的示例输入/输出以显示这一点。
  • 那些记录,在狗和大象之间,第二个字段不是沙哑的 - 应该被省略
【解决方案2】:

文件:

$ cat input

parrot   milana  3 ukraine
dog      husky   1 poland
cat      husky   5 france
elephant malamut 5 belgium
bird     husky   5 turkey

命令:

$ awk '/dog/{m=1} $2 ~ /husky/ && m{print $2} !m{print} /elephant/{m=0}' input

parrot   milana  3 ukraine
husky
husky
bird     husky   5 turkey

【讨论】:

    【解决方案3】:

    您的问题有些含糊不清,但应该这样做:

    awk '/regex2/ {inside=1}
         /regex3/ {inside=0}
         $2 ~ /regex1/ && inside {print $2}
         !inside {print}' input_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 2020-04-02
      • 2011-06-22
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多