我正在使用此命令获取 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
$