Bash 如何在CSV中记录行的第一次/最后一次出现?

Bash 如何在CSV中记录行的第一次/最后一次出现?,bash,csv,sed,Bash,Csv,Sed,你好,我有一个随机结构的CSV文件 ,,,,,VALUE1,,,,,VALUE2,,,, ,,VALUE3,,,VALUE4,,,VALUE5, ,,,,,,,,,,,,,,,,,,, ,,,,,,,VALUE6,,,,VALUE7,, ,,,,,,,,VALUE8,,,,,, 我想输出每行的第一个和最后一个电流 这样 首次出现 VALUE1 VALUE3 (empty) VALUE6 VALUE8 VALUE2 VALUE5 (empty) VALUE7 VALUE8 最后一次 VALU

你好,我有一个随机结构的CSV文件

,,,,,VALUE1,,,,,VALUE2,,,,
,,VALUE3,,,VALUE4,,,VALUE5,
,,,,,,,,,,,,,,,,,,,
,,,,,,,VALUE6,,,,VALUE7,,
,,,,,,,,VALUE8,,,,,,
我想输出每行的第一个和最后一个电流

这样

首次出现

VALUE1
VALUE3
(empty)
VALUE6
VALUE8
VALUE2
VALUE5
(empty)
VALUE7
VALUE8
最后一次

VALUE1
VALUE3
(empty)
VALUE6
VALUE8
VALUE2
VALUE5
(empty)
VALUE7
VALUE8
我已经搜索了几个小时,没有找到实现这一目标的最佳方法

多谢各位


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

使用带有自定义字段分隔符的
awk

第一个非空字段:

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

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

VALUE7
VALUE8
最后一个非空字段:

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

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

VALUE7
VALUE8

正则表达式模式“
”,+”
将使用一个或多个逗号作为字段分隔符。

使用带有自定义字段分隔符的
awk

第一个非空字段:

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

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

VALUE7
VALUE8
最后一个非空字段:

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

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

VALUE7
VALUE8
正则表达式模式
,+'
将使用一个或多个逗号作为字段分隔符。

如果希望将
(空)
作为输出的一部分

第一:

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

如果希望将
(空)
作为输出的一部分

第一:

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

根据这些数据:

cat file
,,,,,VALUE1,,,,,VALUE2,,,,
,,VALUE3,,,VALUE4,,,VALUE5,
,,,,,,,,,,,,,,,,,,,
,,,,,,,VALUE6,,,,VALUE7,,
,,,,,,,,VALUE8,,,,,,
首次出现:

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

VALUE6
VALUE8
tr',''”根据该数据:

cat file
,,,,,VALUE1,,,,,VALUE2,,,,
,,VALUE3,,,VALUE4,,,VALUE5,
,,,,,,,,,,,,,,,,,,,
,,,,,,,VALUE6,,,,VALUE7,,
,,,,,,,,VALUE8,,,,,,
首次出现:

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

VALUE6
VALUE8

tr','''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

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
应该找到第一个,然后

sed -e "s/\(,*\([^,][^,]*\)\)*,*/\2/"
应该找到最后一个

应该找到第一个,然后

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

应该找到最后一个。

之间有数据,
像这样的
a,b,s,VALUE1,d,e
或者它只是
那里。在
之间有数据,
像这样的
a,b,s,VALUE1,d,e
或者它只是
那里。