如何从csv列

时间:2016-02-23 16:24:26

标签: bash shell parsing csv unix

我有一个csv文件,格式如下:

Time, Field1, Field2,
1000, 1,      2,
1001, 3,      4,
1002, 5,      6,

我想从时间列中获取第一个和最后一个元素,并将它们存储在我的bash脚本中的变量中。

所以,基于这个例子,我需要:

$start=1000
$end=1002

我该怎么做?

4 个答案:

答案 0 :(得分:5)

你有很多选择。以下是其中一些:

使用headtailcut

$start=$(head -n2 file.csv | tail -n1 | cut -d',' -f1)
$end=$(tail -n1 file.csv | cut -d',' -f1)

使用awk

$start=$(awk -F',' 'NR==2{print $1}' file.csv)
$end=$(awk -F',' 'END{print $1}' file.csv)

单人使用awk(感谢this answer

read start finish <<< $(awk -F',' 'NR==2{print $1}END{print $1}' file.csv)

另一位使用awk

的单人班轮
read -d'\n' start finish < <(awk -F',' 'NR==2{print $1}END{print $1}' file.csv)

答案 1 :(得分:1)

您可以像这样使用while循环:

while IFS=',' read -r c _; do
   ((end=c))
   ((start==0 && c>0)) && start=$c
done < file.csv

检查变量:

declare -p start end
declare -- start="1000"
declare -- end="1002"

答案 2 :(得分:1)

另外,试试这个:

start_end(){
 start=$(cat csv.file | head -n +2 | tail -n 1 | awk -F ',' '{print $1}')
 end=$(cat csv.file | tail -n 1 | awk -F ',' '{print $1}')
}

答案 3 :(得分:0)

您可以使用sed -n 's/,.*//;2p;$p' file.csv从第一列中提取第一个和最后一个字段。从输出中,您可以将它们分开并将其读入变量,如下所示:

{ 
    read start
    read end
} < <(sed -n 's/,.*//;2p;$p' file.csv)

第一个read将第一行读入变量$start,而第二个read将输出的第二行读入变量$end