如何在CSV中查找行的第一个/最后一个出现位置?

时间:2014-12-28 18:06:56

标签: bash csv sed

您好,我有一个带有此随机结构的CSV文件

,,,,,VALUE1,,,,,VALUE2,,,,
,,VALUE3,,,VALUE4,,,VALUE5,
,,,,,,,,,,,,,,,,,,,
,,,,,,,VALUE6,,,,VALUE7,,
,,,,,,,,VALUE8,,,,,,

我想输出每一行的第一个和最后一个。

以这种方式

首次发生

VALUE1
VALUE3
(empty)
VALUE6
VALUE8

最后一次发生

VALUE2
VALUE5
(empty)
VALUE7
VALUE8

我已经搜索了几个小时,但没有找到实现这一目标的最佳方法。

非常感谢。

编辑:谢谢大家,这个,+作为分隔符是关键。

5 个答案:

答案 0 :(得分:4)

awk与自定义字段分隔符结合使用:

首先是非空字段:

awk -F ',+' '{print $2}' file
VALUE1
VALUE3

VALUE6
VALUE8

最后一个非空字段:

awk -F ',+' '{print $(NF-1)}' file
VALUE2
VALUE5

VALUE7
VALUE8

正则表达式模式',+'会将1个或多个逗号作为字段分隔符。

答案 1 :(得分:1)

Perl适用于此任务

perl -F, -lane '@G = grep {$_ ne ""} @F; print $G[0]' file

grep命令过滤掉空字段 要打印最后一个字段,请将$G[0]更改为$G[-1]


使用sed:

 sed 's/^,*//; s/,.*//' file   # first field
 sed 's/,*$//; s/.*,//' file   # last field

答案 2 :(得分:0)

如果你将(empty)作为输出的一部分。

第一

sed '
 s/,*\([^,]\+\).*/\1/;
 s/^,*$/(empty)/;
'

最后:

sed '
 s/\(^\|.*,\)\([^,]\+\),*/\2/;
 s/^,*$/(empty)/;
'

答案 3 :(得分:0)

从这些数据:

cat file
,,,,,VALUE1,,,,,VALUE2,,,,
,,VALUE3,,,VALUE4,,,VALUE5,
,,,,,,,,,,,,,,,,,,,
,,,,,,,VALUE6,,,,VALUE7,,
,,,,,,,,VALUE8,,,,,,

第一次出现:

tr ',' ' ' <file | awk '{print $1}'
VALUE1
VALUE3

VALUE6
VALUE8

最后:

tr ',' ' ' <file | awk '{print $NF}'
VALUE2
VALUE5

VALUE7
VALUE8

答案 4 :(得分:0)

sed -e "s/,*\([^,]*\).*/\1/"

应该找到第一个,

sed -e "s/\(,*\([^,][^,]*\)\)*,*/\2/"

应该找到最后一个。