【问题标题】:Parse a text file using shell script使用 shell 脚本解析文本文件
【发布时间】:2022-01-13 09:44:04
【问题描述】:

我被这个活动卡住了,我有一个如下所示的 txt 文件

0112 00000 34 JOB RECOVERY status poll (ORDERID 2N000, RUNNO 0001) ACCEPTED, OWNER
0112 00000 35 JOB RECOVERY status poll (ORDERID 2N000, RUNNO 0001)STARTED , APPL TYPE
0112 00000 36 JOB PROCESS_kafka(ORDERID 2N001, RUNNO 0001) ACCEPTED , OWNER
0112 00001 37 JOB PROCESS_kafka (ORDERID 2N001, RUNNO 0001) STARTED, APPL_TYPE
0112 00001 38 JOB RECOVERY  status poll(ORDERID 2N000, RUNNO 0001) ENDED OK ,ELAPSED - 0.02 SEC
0112 00003 39 JOB PROCESS (ORDERID 2N001, RUNNO 0001) ENDED OK, ELAPSED - 2.28 SEC

我需要为每个作业的每个 orderid 获取经过的值,如果 orderid 是 2N000,我需要,那么经过的我应该得到 - 0.02 秒。像这样对于我需要使用 shell 脚本从文件中获取的每个 orderid。

我需要这样的输出

orderid    jobname     ELAPSED
2N000      RECOVERY    0.02
2NOO1      PROCESS     2.28

【问题讨论】:

  • 请发布相关的预期输出。不要以评论、图像、表格或非现场服务的链接的形式发布,而是使用文本并将其包含在您的原始问题中。此外,由于这不是免费的编码服务,我们希望能先看到一些尝试。谢谢
  • awk 可以轻松解决问题。但是你能告诉我到目前为止你有什么吗?我的意思是,脚本。
  • 我试图 grep ORDERID 文件名 | awk 模式,对于 elapsed 也一样..但这给了我错误匹配 orerid 和 elapsed,@kent

标签: linux shell


【解决方案1】:
grep ELAPSED file.txt \
| cut -d' ' -f7,5,14 \
| sed -E 's/(.*) ([^[:space:]]+),/\2 \1/'
  • grep 只选择带有“ELAPSED”的行;
  • cut 仅提取具有 orderid、jobname 和经过时间的列;
  • 但它们的顺序错误,因此sed 删除了 orderid 中的逗号并重新排列了列。

如果sed不可用,可以使用awk

awk '/ELAPSED/{id=$7; sub(",", "", id); print id, $5, $14}' file.txt
  • 在包含ELAPSED 的行中,第七个值存储在id 中,其中去掉逗号,并打印id、作业名和经过时间。

【讨论】:

  • sed 给我:没有这样的文件或目录
  • @Deepak:你的意思是你没有安装sed
  • 是的@choroba ..还有其他方法吗
  • 您是否安装了awk?还是perl
  • 我已经安装了 awk
【解决方案2】:

这并不完美,但它是一个开始:

grep -i "elapse" test.txt | awk -F " " '{print $7 " " $5 " " $14}'

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2011-04-27
    • 2014-04-28
    • 2022-11-30
    • 1970-01-01
    相关资源
    最近更新 更多