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

时间:2018-02-27 15:11:16

标签: awk sed

我有以下格式的数据

    //a method to make simon flash based on the arraylist
public void flashArry(){
    for(int i=0;i<blist.size();i++){

        int toFlash = blist.get(i);
        setFlashed(toFlash);
        repaint();
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(Simon.class.getName()).log(Level.SEVERE, null, ex);
        }
        setFlashed(F_DEFAULT);
        repaint();
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) {
            Logger.getLogger(Simon.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

我正在尝试以下面的格式获取数据

select 
abc       string                                      
adef        double                                      
opr           timestamp                                   
from Test;

select 
dfg       string                                      
asd        double                                      
wer           timestamp                                   
from Test1;

我尝试使用awk获取不以select或select abc, adef, opr from Test; select dfg, asd, wer from Test1; 开头的行的第二个字段。但不知道如何用逗号替换。另外,如何避免来自

之前的行的逗号

此致

4 个答案:

答案 0 :(得分:1)

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

为了避免from之前的行中的逗号,因为您不知道何时停止使用逗号直到到达块的最后一行,所以更容易添加逗号处理当前行时到上一行(适当时)。

添加您不需要实际&#34;替换&#34;第二个带逗号的字段,你可以放一个文字逗号并完全忽略第二个字段。

$ 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;

答案 1 :(得分:1)

$ awk '{n=(NR%6)} n~/[234]/{$0=$1(n<4?",":"")} 1' file
select
abc,
adef,
opr
from Test;

select
dfg,
asd,
wer
from Test1;

或者如果您愿意:

$ awk -v RS= '{printf "%s\n%s,\n%s,\n%s\n%s %s\n\n", $1, $2, $4, $6, $8, $9}' file
select
abc,
adef,
opr
from Test;

select
dfg,
asd,
wer
from Test1;

答案 2 :(得分:1)

这适用于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;

文件末尾会有一个额外的换行符可以通过管道移除到sed '$d'

答案 3 :(得分:1)

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

输出:

select 
abc,
adef,
opr
from Test;

select 
dfg,
asd,
wer
from Test1;