您好,我有一个带有此随机结构的CSV文件
,,,,,VALUE1,,,,,VALUE2,,,,
,,VALUE3,,,VALUE4,,,VALUE5,
,,,,,,,,,,,,,,,,,,,
,,,,,,,VALUE6,,,,VALUE7,,
,,,,,,,,VALUE8,,,,,,
我想输出每一行的第一个和最后一个。
以这种方式
首次发生
VALUE1
VALUE3
(empty)
VALUE6
VALUE8
最后一次发生
VALUE2
VALUE5
(empty)
VALUE7
VALUE8
我已经搜索了几个小时,但没有找到实现这一目标的最佳方法。
非常感谢。
编辑:谢谢大家,这个,+作为分隔符是关键。
答案 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/"
应该找到最后一个。