使用awk或sed将特定行的第二个字符串替换为逗号

使用awk或sed将特定行的第二个字符串替换为逗号,awk,sed,Awk,Sed,我有以下格式的数据 select abc string adef double opr timestamp from Test; select dfg string

我有以下格式的数据

select 
abc       string                                      
adef        double                                      
opr           timestamp                                   
from Test;

select 
dfg       string                                      
asd        double                                      
wer           timestamp                                   
from Test1;
我正在尝试获取以下格式的数据

select 
abc,
adef,
opr
from Test;

select 
dfg,
asd,
wer
from Test1;
select 
abc,
adef,
opr
from Test;

select 
dfg,
asd,
wer
from Test1;
我尝试使用awk为不以select或from
awk'!/^开头的行获取第二个字段*来自/{print$2}'sample.txt
。但不知道如何替换为逗号。另外,如何避免前面的行使用逗号


关于这一点,

通过解释,没有什么可补充的,因为它只是一堆打印语句和打开或关闭标志。这并不是说很容易理解,也许其他人会有一个更具表现力的解决方案

为了避免在中的
之前的行中使用逗号,因为在到达块的最后一行之前,您不知道何时停止使用逗号,因此在处理当前行时,将逗号添加到前一行(如果合适)更容易

添加您不需要实际用逗号“替换”第二个字段,您只需使用文字逗号并完全忽略第二个字段

$ cat a.awk
/^ *from/ { printf "\n%s\n\n", $0; f1 = f2 = 0; }
f2 { printf ",\n%s", $1 }
f1 { printf "%s", $1; f1 = 0; f2 = 1;}
/^ *select/ {print; f1 = 1}

$ awk -f a.awk f
select
abc,
adef,
opr
from Test;

select
dfg,
asd,
wer
from Test1;

这里没有太多的解释,因为它只是一堆打印语句和打开或关闭标志。这并不是说很容易理解,也许其他人会有一个更具表现力的解决方案

为了避免在
中的
之前的行中使用逗号,因为在到达块的最后一行之前,您不知道何时停止使用逗号,因此在处理当前行时,将逗号添加到前一行(如果合适)更容易

添加您不需要实际用逗号“替换”第二个字段,您只需使用文字逗号并完全忽略第二个字段

$ cat a.awk
/^ *from/ { printf "\n%s\n\n", $0; f1 = f2 = 0; }
f2 { printf ",\n%s", $1 }
f1 { printf "%s", $1; f1 = 0; f2 = 1;}
/^ *select/ {print; f1 = 1}

$ awk -f a.awk f
select
abc,
adef,
opr
from Test;

select
dfg,
asd,
wer
from Test1;

这将适用于select语句中任意数量的列

$ awk 'BEGIN{RS=""; FS=OFS="\n"; ORS=FS FS} 
            {for(i=2;i<NF;i++) gsub(/ .*/,(i==NF-1)?"":",",$i)}1' file

select
abc,
adef,
opr
from Test;

select
dfg,
asd,
wer
from Test1;
$awk'开始{RS=”“;FS=OFS=“\n”;ORS=FS-FS}

{for(i=2;i这将适用于select语句中任意数量的列

$ awk 'BEGIN{RS=""; FS=OFS="\n"; ORS=FS FS} 
            {for(i=2;i<NF;i++) gsub(/ .*/,(i==NF-1)?"":",",$i)}1' file

select
abc,
adef,
opr
from Test;

select
dfg,
asd,
wer
from Test1;
$awk'开始{RS=”“;FS=OFS=“\n”;ORS=FS-FS}

{对于(i=2;i
Awk
解决方案:

awk 'f && r{
         if (/from/){ sep = ORS $0; f = 0 }
         printf "%s%s\n", r, sep 
     }
     $1 == "select"{ f = 1; sep = ","; print; next }
     { r = $1; if (r == "") print }' file
输出:


Awk
解决方案:

awk 'f && r{
         if (/from/){ sep = ORS $0; f = 0 }
         printf "%s%s\n", r, sep 
     }
     $1 == "select"{ f = 1; sep = ","; print; next }
     { r = $1; if (r == "") print }' file
输出: