如何提取 csv 文件中的一列

如果我有一个 csv 文件,有没有一种快速的 bash 方法可以只打印出任何一列的内容? 可以肯定的是,每一行的列数相同,但每一列的内容长度不同。

解决办法

你可以使用 awk 来实现这一点。将 '$2' 改为你想要的第 n 列。

awk -F "\"*,\"*" '{print $2}' textfile.csv
评论(5)

是的。cat mycsv.csv | cut -d ',' -f3 将打印第 3 列。

评论(3)

其他答案都很有效,但既然你要求只用 bash shell 来解决问题,那么你可以这样做:

AirBoxOmega:~ d$ cat > file #First we'll create a basic CSV
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10
a,b,c,d,e,f,g,h,i,k
1,2,3,4,5,6,7,8,9,10

然后你可以像这样取出列(本例中的第一列):

AirBoxOmega:~ d$ while IFS=, read -a csv_line;do echo "${csv_line[0]}";done < file
a
1
a
1
a
1
a
1
a
1
a
1

因此,这里有几件事要做:

  • while IFS=, - 这是说使用逗号作为 IFS(内部字段分隔符),shell 用逗号来分隔字段(文本块)。所以说 IFS=, 就像说 "a,b" 和 IFS=" " 时的 "a b" 是一样的(默认情况下就是这样)。

  • read -a csv_line;-这表示每次读入一行,并创建一个数组,其中每个元素都称为"csv_line",然后将其发送到 while 循环的"do"部分。

  • do echo "${csv_line[0]}";done

评论(0)