使用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或fromawk'!/^开头的行获取第二个字段*来自/{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;iAwk
解决方案:
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
输出: