首页 > 解决方案 > sed - 通过组合 3 个 sed 命令从 .txt 的不同部分提取 2 个单词之间的数据

问题描述

我有多个 .txt 包含这样的信息:

"commercial_name":"THE OUTBACK","contact_name":"JEFF","contact_person":"MANAGER","working_place"

在给定的句子后面和之后有很多垃圾。我想得到这样的结果:

THE OUTBACK,JEFF,MANAGER

每个 .txt 文件都在同一行,但为下一个 .txt 跳转行。

我正在使用 3 个不同的 sed 命令

sed -n 's:.*"commercial_name"\(.*\)"contact_name".*:\1:p' *.txt

sed -n 's:.*"contact_name"\(.*\)"contact_person".*:\1:p' *.txt

sed -n 's:.*"contact_person"\(.*\)"working_place".*:\1:p' *.txt

即使我将这 3 个结合起来,结果也是:

:"THE OUTBACK",

-所有商业名称每个 .txt 1 行

:"JEFF",

-所有联系人姓名每个 .txt 1 行

:"MANAGER",

-所有联系人每个.txt 1 行

我想在同一行中提取所有信息:

THE OUTBACK,JEFF,MANAGER

然后是下一行中下一个 .txt 的信息,依此类推。

标签: bashawksedgrep

解决方案


你可以使用这个awk

awk 'BEGIN {
    FS=OFS=","
}
{
   gsub(/"/, "")
   for(i=1; i<=NF; ++i) {
      if (split($i, entry, ":") == 2)
         map[entry[1]] = entry[2]
   }
   print map["commercial_name"], map["contact_name"], map["contact_person"]
}' file
THE OUTBACK,JEFF,MANAGER

推荐阅读