当前位置: 首页 > 面试题库 >

如何解析多行记录(使用awk?)

韩玉石
2023-03-14
问题内容

我试图弄清楚如何从由分隔的多行记录中提取特定字段\n\n

在这种情况下,它恰巧是从apt-cache类似于DEBIAN控制文件输出的。查看输出apt-cache show "$package"

Package: caffeine
Priority: optional
Section: misc
Installed-Size: 641
Maintainer: Reuben Thomas <rrt@sc3d.org>
Architecture: all
Version: 2.8.3
Depends: python3:any (>= 3.3.2-2~), python3, gir1.2-gtk-3.0, gir1.2-appindicator3-0.1, python3-xlib, python3-pkg-resources, libnet-dbus-perl
Filename: pool/main/c/caffeine/caffeine_2.8.3_all.deb
Size: 58774
MD5sum: 4438db3f6d1cf43a4f4b49cc7f24cda0
SHA1: e748370ac5ccd7de6fc9466ce0451d2e90d179d4
SHA256: ae303b4e32949cc1e1af80df7217e3406291679e3f18fa8f78a5bbb97504c4f6
Description-en: Prevent the desktop becoming idle in full-screen mode
 Caffeine stops the desktop becoming idle when an application
 is running full-screen. A desktop indicator ‘caffeine-indicator’
 supplies a manual toggle, and the command ‘caffeinate’ can be used
 to prevent idleness for the duration of any command.
Description-md5: 7c14f8adc007b10f6ecafed36260bedb

Package: caffeine
Priority: optional
Section: misc
Installed-Size: 655
Maintainer: Reuben Thomas <rrt@sc3d.org>
Architecture: all
Version: 2.6+555~ubuntu14.04.1
Depends: python:any (<< 2.8), python:any (>= 2.7.5-5~), python, gir1.2-gtk-2.0, gir1.2-appindicator3-0.1, x11-utils, python-dbus
Filename: pool/main/c/caffeine/caffeine_2.6+555~ubuntu14.04.1_all.deb
Size: 58604
MD5sum: 1051c3f7d40d344f986bb632d7436849
SHA1: 5e5f622595e8cbba8fb7468b3cffe2914b0ba110
SHA256: 11c5bbf2d28dcda6a7b82872195f740f1f79521b60d3c9acea3037bf0ab3a60e
Description: Prevent the desktop becoming idle
 Caffeine allows the user to prevent the desktop becoming idle,
 either manually or when certain applications are run. This
 prevents screen-blanking, locking, suspending, and so on.
Description-md5: 738866350e5086e77408d7a9c7ffa59b

Package: caffeine
Status: install ok installed
Priority: optional
Section: misc
Installed-Size: 794
Maintainer: Isaiah Heyer <freshapplepy@gmail.com>
Architecture: all
Version: 2.4.1+478~raring1
Depends: dconf-gsettings-backend | gsettings-backend, python (>= 2.6), python-central (>= 0.6.11), python-xlib, python-appindicator, python-xdg, python-notify, python-kaa-metadata
Description: Caffeine
 A status bar application able to temporarily prevent the activation
 of both the screensaver and the "sleep" powersaving mode.
Description-md5: 1c29acf1ab0f2e6636db29fbde1d14a3
Homepage: https://launchpad.net/caffeine
Python-Version: >= 2.6

我想要的输出是格式中的每条记录一行apt-get download $pkg=$ver -a=$arch。基本上是可用软件包的安装命令列表…

到目前为止,我所拥有的是 apt-cache show "$package" | awk '/^Package: / { print $2 } /^Version: / { print $2 } /^Architecture: / { print $2 }' | xargs -n3 | awk '{printf "apt-get download %s=%s -a=%s\n", $1, $3, $2}'

这是实际输出:

apt-get download caffeine=2.8.3 -a=all
apt-get download caffeine=2.6+555~ubuntu14.04.1 -a=all
apt-get download caffeine=2.4.1+478~raring1 -a=all

是所需的,但似乎只是a幸,因为在此示例中字段的顺序是一致的。如果字段的顺序不同,则会中断。

我可以在Python中使用面向对象来进行此类解析,但是我很难在一个awk命令中完成此操作。我看到正确执行此操作的唯一方法是将每个记录拆分为单独的tmp文件(使用split或沿这些行的内容),然后分别解析每个文件(这很简单)。显然,我真的很想避免不必要的I
/
O,因为awk似乎已为此做好了准备。任何awk专业人士都知道如何解决此问题?我什至愿意接受Perl单线脚本或使用bash,但我真的对学习如何更好地利用awk感兴趣。


问题答案:
$ package=sed
$ apt-cache show "$package" | awk '/^Package: /{p=$2} /^Version: /{v=$2} /^Architecture: /{a=$2} /^$/{print "apt-get download "p"="v" -a="a}' 
apt-get download sed=4.2.1-10 -a=amd64

怎么运行的

  • /^Package: /{p=$2}

将软件包信息保存在variable中p

  • /^Version: /{v=$2}

将版本信息保存在variable中v

  • /^Architecture: /{a=$2}

将体系结构信息保存在variable中a

  • /^$/{print "apt-get download "p"="v" -a="a}

当我们到达空白行时,以所需的形式打印出信息。

我的版本apt-cache总是在每个软件包后输出空白行。您的示例输出缺少最后一个空白行。如果您apt- cache确实没有产生最后的空白行,那么我们将需要添加更多代码来进行补偿。

作为一个风格问题,有些人可能更喜欢printfprint。在这种情况下,请将以上内容替换为:

    /^$/{printf "apt-get download %s=%s -a=%s\n",v,p,a}'


 类似资料:
  • 我试图使用统一解析器来解析一个固定宽度格式的文件,该文件每行包含可变数量的固定宽度记录。 格式为记录id[6],子记录[3]的#,子记录[6] 期望的结果是有一个子记录数组。@链接注释似乎适用,但留档声明这仅适用于超文本标记语言解析器。 我目前的解决方案是将子记录解析为字符串,然后循环遍历每个记录,并在子记录字符串中插入换行符,然后重新解析。有没有一种方法可以使用univocity解析器来实现这一

  • Java16引入了记录,这有助于在编写携带不可变数据的类时减少样板代码。当我尝试将记录用作bean时,我得到以下错误消息: 如何将记录用作?

  • 问题内容: 我的s3存储桶中有多行XML文件(约800行),我想在Elasticsearch中对其进行索引,但无法在logstash中对其进行解析。字段有时为空,因此无法手动分析文件。 我的xml看起来像: 在我的输入中,我有配置: 在我的过滤器中,以下配置: 问题答案: 好的,看起来好像是问题所在,您对多行编解码器和XML过滤器感到困惑。 我可以建议您设置多行: 这将采用 不 包含此标记的任何行

  • 我有一个名为employee_Details列的表名称 我使用Java构建JSON数组。具有结构 {[“EMP\u ID”:1,“NAME”:Y,“VECH\u NO”:4587,“SALARY”:1500),“EMP\u ID”:3,“NAME”:Z,“VECH\u NO”:4007,“SALARY”:1800]} 我需要更新表上EMP\U ID存在的完整记录,否则将作为新记录插入。postgr

  • 我有一个基于Spring boot sleuth的应用程序。一切正常。我现在有这样的日志: 现在,我想将自定义MDC添加到我的日志中,例如合同引用。我想要这样的日志: 我尝试了各种方法,但都没有成功: 使用Spring Sleuth Tracer添加标签; 使用MDC. put(xxx, xxx)将logging.pattern.level=%5p%mdc添加到我的application.prop

  • 我正在尝试使用JSOUP解析来自特定网站的信息。到目前为止,我可以解析和显示单行,因为网站有很多html,我对此很陌生,我想知道有没有一种方法可以解析包含单词“fixturerow”的页面上的所有表行。 下面是我的解析器代码: 谢谢你抽出时间!