Awk:从 CSV 中删除前几个字段

Awk:从 CSV 中删除前几个字段

我正在使用此命令获取 csv 格式的输出。

awk 'ORS="," {print $2}'

我得到以下格式的输出:

a,b,c,name,col1,col2,col3,

在这里,我想删除“名称”和“名称”之前的所有内容,并仅获取列名称。请注意,列名也可以有工作“名称”,我不想删除它。所以我可以只删除第一次出现的名字。这可以用 awk 完成吗?

我努力了:

awk 'NR >4 {print $2}' | awk '{ORS=","}'

以及各种组合,但都不起作用。

答案1

如果是原始文件中每行的第二个字段,那么您可以在挑选这些字段的同时a,b,c,name,col1,col2,col3,进行测试(这仍然留下烦人的最后逗号):name

$ awk -vORS=, 'p {print $2}; $2 == "name" {p=1} ' input; echo
col1,col2,col3,

因此,从您拥有的 ( awk 'ORS="," {print $2}') 开始,我们添加一个测试变量p来判断是否name已经被看到。仅当第二个字段之前已设置为 true 值时,我们才打印第二个字段,p如果第二个字段恰好为 ,则将其设置为 true name。按照此顺序进行测试,name不会打印该列本身。我们还可以通过更改p {print $2}为 来忽略输入中的空行$0 && p {print $2},也就是说,将真实(非空)输入行与 一起作为打印的条件p

我在这里假设原始输入如下所示:

x a
x b
x c
x name
x col1
x col2
x col3

或者,从逗号分隔的列表开始a,b,c,name,somename,othername,col3,

$ echo 'a,b,c,name,somename,othername,col3,' | 
    sed -e 's/.*,name,//' -e s'/,$//'
somename,othername,col3

,name,请注意模式中两侧的逗号,它们可以防止贪婪.*捕获以 结尾的后续名称...name

答案2

假设文件内容如下:

$ cat myfile
a,b,c,name,col1,col2,col3,forename,surname,name5,foo,name,name6
$ 

awk解决方案

$ awk -F',name,' '{print substr($0,index($0,$2))}' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$

perl解决方案。

$ perl -pe 's/^.*?name,//' myfile
col1,col2,col3,forename,surname,name5,foo,name,name6
$

相关内容