【问题标题】:Using awk or sed split pipe separated values into new lines keeping first string as common使用 awk 或 sed 拆分管道将值分隔到新行中,保持第一个字符串相同
【发布时间】:2018-09-15 16:35:58
【问题描述】:

以下是我的输入和所需的输出。如何在 unix 中使用 sed 或 awk 来实现这一点?单个命令或管道都可以。

输入

PRODUCT1,PRICEa|PRICEb|PRICEc
PRODUCT2,PRICEd
PRODUCT3,PRICEe|PRICEf
(and so on)

输出

PRODUCT1,PRICEa
PRODUCT1,PRICEb
PRODUCT1,PRICEc
PRODUCT2,PRICEd
PRODUCT3,PRICEe
PRODUCT3,PRICEf
(and so on)

【问题讨论】:

  • 你忘了展示你解决这个问题的尝试。
  • in awk 将 FS 设置为逗号,用管道符号分割第二个字段,循环遍历元素并打印第一个字段并拆分数组元素
  • 关于我的尝试,这不是实际的输入。我在此之前有管道,它从 XML 文件中获取数据并通过一些管道进行格式化,直到输入。但剩下的部分我不能用 sed 做。我是 awk 的新手,但我认为 awk 可以实现。

标签: bash unix awk sed sh


【解决方案1】:

遵循简单的awk 可能会对您有所帮助。

awk -F, '{gsub(/\|/,ORS $1",")} 1'   Input_file

【讨论】:

  • 哇,我想这就是我需要的。非常感谢。
  • @Cozimetzer,很高兴它对您有所帮助 :) 因为 SITE SO 是最好的网站,它可以诚实地学习任何东西,继续学习,在这里分享您会有所进步。对于 O'Reilly 的书可以帮助您,也可以查看此链接一次 stackoverflow.com/help/someone-answers
  • 非常感谢。它说我需要等待 5 分钟才能接受您的回答。我一定会接受的。
  • @Cozimetzer,干杯 :) 继续学习,继续分享,享受。
  • ++ 非常好的答案。 awk -F, '{gsub(/\|/,ORS $1 FS)} 1' file 可能会更好。
【解决方案2】:

狂欢

while IFS=',|' read -ra fields; do
    printf "${fields[0]},%s\n" "${fields[@]:1}"
done < file

另一个 awk

awk -F '[,|]' -v OFS=, '{for (i=2; i<=NF; i++) print $1,$i}' file

【讨论】:

    【解决方案3】:

    使用 gnu sed

    sed -E ':A;s/([^,]*,)(.*)\|(.*)/\1\2\n\1\3/;tA' infile
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多