Sed 有没有办法在文本文件的分隔符之间添加字符?

Sed 有没有办法在文本文件的分隔符之间添加字符?,sed,Sed,我有一个输入文件(customers.txt),如下所示: Name, Age, Email, Hank, 22, hank@mail.com Nathan, 32, nathan@mail.com Gloria, 24, gloria@mail.com Name: Hank Age: 22 Email: hank@mail.com Name: Nathan Age: 32 Email: nathan@mail.com Name: Gloria Age: 24 E

我有一个输入文件(customers.txt),如下所示:

Name, Age, Email, 
Hank, 22, hank@mail.com
Nathan, 32, nathan@mail.com
Gloria, 24, gloria@mail.com
Name: Hank     Age: 22   Email: hank@mail.com
Name: Nathan   Age: 32   Email: nathan@mail.com
Name: Gloria   Age: 24   Email: gloria@mail.com
我试图将其输出到一个文件(customersnew.txt),使其看起来像这样:

Name, Age, Email, 
Hank, 22, hank@mail.com
Nathan, 32, nathan@mail.com
Gloria, 24, gloria@mail.com
Name: Hank     Age: 22   Email: hank@mail.com
Name: Nathan   Age: 32   Email: nathan@mail.com
Name: Gloria   Age: 24   Email: gloria@mail.com
到目前为止,我只能得到如下输出:

Name: Hank, 22, hank@mail.com
Name: Nathan, 32, nathan@mail.com
Name: Gloria, 24, gloria@mail.com
我使用的代码是

sed -e '1d'\
    -e 's/.*/Name: &/g' customers.txt > customersnew.txt

我还尝试使用
-e's/,/\n/g'\
-e'2s/*年龄:&/g'
分离数据。它不起作用。任何帮助都将不胜感激

您是否考虑过为此使用awk?比如:

$ awk 'BEGIN {FS=", ";OFS="\t"} NR==1 {split($0,hdr);next} {for(i=1;i<=NF;i++)$i=hdr[i]": "$i} 1' file
Name: Hank      Age: 22 Email: hank@mail.com
Name: Nathan    Age: 32 Email: nathan@mail.com
Name: Gloria    Age: 24 Email: gloria@mail.com

$awk'BEGIN{FS=“,”OFS=“\t”}NR==1{split($0,hdr);next}{for(i=1;i您考虑过为此使用awk吗?比如:

$ awk 'BEGIN {FS=", ";OFS="\t"} NR==1 {split($0,hdr);next} {for(i=1;i<=NF;i++)$i=hdr[i]": "$i} 1' file
Name: Hank      Age: 22 Email: hank@mail.com
Name: Nathan    Age: 32 Email: nathan@mail.com
Name: Gloria    Age: 24 Email: gloria@mail.com

$awk'BEGIN{FS=“,”OFS=“\t”}NR==1{split($0,hdr);next}{for(i=1;i请尝试以下内容

awk '
BEGIN{
  FS=", "
  OFS="\t"
}
FNR==1{
  for(i=1;i<=NF;i++){
    value[i]=$i
  }
  next
}
{
  for(i=1;i<=NF;i++){
    $i=value[i] ": " $i
  }
}
1
'  Input_file
awk'
开始{
FS=“,”
OFS=“\t”
}
FNR==1{

对于(i=1;i你能试试下面的吗

awk '
BEGIN{
  FS=", "
  OFS="\t"
}
FNR==1{
  for(i=1;i<=NF;i++){
    value[i]=$i
  }
  next
}
{
  for(i=1;i<=NF;i++){
    $i=value[i] ": " $i
  }
}
1
'  Input_file
awk'
开始{
FS=“,”
OFS=“\t”
}
FNR==1{
对于(i=1;i这可能适合您(GNU-sed&column):

将标题复制到保留空间

将标题附加到每个详图行

在行首加逗号

创建替换循环,用附加标题中的第一个标题替换第一个逗号

替换完所有逗号后,打印第一行并删除其余行

要以整齐的列显示,请使用带有
-t
选项的column命令。

这可能适合您(GNU-sed&column):

将标题复制到保留空间

将标题附加到每个详图行

在行首加逗号

创建替换循环,用附加标题中的第一个标题替换第一个逗号

替换完所有逗号后,打印第一行并删除其余行


要以整齐的列显示,请使用带有
-t
选项的column命令。

这与@oguzismail的答案相同,但使用循环填充标头数组,而不是只调用split()@EdMorton,谢谢Ed先生,我注意到现在我在考虑使用single for loop,每次它检查任何一行是否为第一行,或者创建数组或重新创建字段,但是每次出现这种情况时它都需要进行不必要的检查,所以现在就放弃了这种想法。是的,我过去也考虑过这种类型的问题b但是,我相信你已经明白了,测试
FNR==1
每行每字段一次,而不是每行只测试一次,效率太低了。这与@oguzismail的答案相同,但是使用循环来填充标头数组,而不是只调用split()@EdMorton,谢谢Ed先生,我注意到现在我在考虑使用single for loop,每次它检查任何一行是否为第一行,或者创建数组或重新创建字段,但是每次出现这种情况时它都需要进行不必要的检查,所以现在就放弃了这种想法。是的,我过去也考虑过这种类型的问题b但是,正如我确信您所理解的,每行每字段测试一次
FNR==1
比每行测试一次效率太低了。OP可能会想添加
|column-s$'\t'-t
,因为他们似乎想要直观的表格输出,而不是制表符分隔的输出。OP可能会想添加
|column-s$'\t“-t
,因为他们似乎希望直观地以表格形式输出,而不是以制表符分隔的输出。