我有一个文件sample.txt,它的内容是
line-1
Generic-text-1 line-2
Generic-text-2 line-3
line-2
Generic-text-1 line-2
Generic-text-2 line-3我希望将文件的内容更改为CSV,以便如下所示进行内容转换。
line-1,line-2,line-3
line-2,line-2,line-3我正在尝试使用sed命令,但无法使用换行符。
sed -i 's/\nGeneric-text-1/,/g' sample.txt
sed -i 's/\nGeneric-text-2/,/g' sample.txt提前感谢
发布于 2020-09-26 20:27:37
这可能适用于您(GNU sed):
sed -E ':a;$!N;s/\n\S+\s/,/;ta;P;D' file收集行,将换行符、第一个字段及其分隔符替换为逗号。当匹配失败时,打印第一行,删除它,然后重复。
更详细的解释:
-E命令行选项扩展了正则表达式。在这种情况下,允许速记\+.:a而不是+是一个占位符a,它允许在此时继续执行sed命令(与ta +一起使用,只要当前行不是文件$!中的最后一行,就将下一行N附加到模式空间中的当前行。模式空间是sed命令在其上的缓冲区executed.s/\n\S+\s/,/是替换命令,在该替换命令中,将替换新行的匹配,后跟一个或多个非空格字符,后跟一个空白字符,即,在附加行的开始处的单词,后跟至少一个space.ta。如果替换成功,则将代码执行跳到占位符a,即,在这一点上返回最后一个替换的后退2秒失败,并且此操作打印到并包括模式space.D中的第一个换行符,这将删除模式空间中的第一个换行符。但是,与重新启动sed循环并将下一行读入模式空间的d命令不同,此命令仅在当前模式空间为空时才执行此操作。如果它包含值,则从第一个sed命令恢复,在本例中为命令:a.因此,sed程序会蚕食该文件,创建并打印/删除自己创建的行。
或者在紧要关头:
sed -z 's/\n\S\+ /,/g' file或者:
awk '{gsub(/\n\S+ /,",")}1' RS= file发布于 2020-09-26 20:38:55
使用awk,您可以执行以下操作:
awk -v OFS=, 'NF > 1 {
printf "%s", OFS $NF
}
NF == 1 {
if (NR>1)
print ""
printf "%s", $1
}
END {
print ""
}' fileline-1,line-2,line-3
line-2,line-2,line-3发布于 2020-09-26 21:26:00
您可以尝试使用GNU awk编写和测试下面的示例吗?
awk '
BEGIN{ OFS="," }
/^line/{
if(val){
print val
}
val=$1
next
}
{
val=(val?val OFS:"")$NF
}
END{
if(val){
print val
}
}' Input_filehttps://stackoverflow.com/questions/64076813
复制相似问题