Sed 有没有办法在文本文件的分隔符之间添加字符?
我有一个输入文件(customers.txt),如下所示: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
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
,因为他们似乎希望直观地以表格形式输出,而不是以制表符分隔的输出。