格式化数据以使用sed或awk以逗号分隔记录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了格式化数据以使用sed或awk以逗号分隔记录相关的知识,希望对你有一定的参考价值。

我有以下格式的数据:

 id : 1234, name :  ABC, XYZ
 id : 7891, name :  MNO 

我试图以下面的格式实现数据:

 id : 1234, name :  ABC
 id : 1234, name :  XYZ
 id : 7891, name :  MNO

我能够完成第一行,但是如何将id带到第二行?

答案

Awk解决方案:

awk '{ $NF=$NF }
     $NF ~ /,/{ 
         gsub(/[[:space:]]*/, "", $NF);
         len=split($NF, a, ",");
         for (i=1; i<=len; i++) { $NF=a[i]; print $0 }
         next 
     }1' FS=' +: +' OFS=' : ' file

输出:

id : 1234, name : ABC
id : 1234, name : XYZ
id : 7891, name : MNO
另一答案

如果您的Input_file与显示的示例相同,那么以下内容可能会对您有所帮助。

awk -F, '
{
  split($2,array," ");
  print $1","$2;
  for(i=3;i<=NF;i++){
    print $1", "array[1],array[2],$i}
}
'   Input_file

输出如下:

id : 1234, name :  ABC
id : 1234, name :  XYZ
id : 7891, name :  MNO
另一答案

另一个awk解决方案

awk -F: '
{
a=split($NF,b,",");
for(i=1;i<=a;i++)
  {
  sub(/^ */,"",b[i]);
  $NF=" "b[i];
  print $0
  }
}
' OFS=: infile

或者用sed

sed -n '
s/.*/&,/
:A
h
s/(.*:.*:)([^,]*),(.*)/13/
x
s/(.*:.*:)([[:blank:]]*)([^,]*),(.*)/1 3/p
x
/,$/bA
' infile

以上是关于格式化数据以使用sed或awk以逗号分隔记录的主要内容,如果未能解决你的问题,请参考以下文章

CSV (逗号分隔值文件格式)

CSV (逗号分隔值文件格式)

Linux中awk用法

使用 awk 或 sed 在文件中动态替换字符串

在 awk 或 sed 中将十六进制转换为十进制

如何使用 sed/awk 替换逗号分隔字符串中的第 n 列/字段?