从Bash脚本中的CSV获取特定列

时间:2016-03-09 12:47:31

标签: linux bash csv

我有一个带有近百列的csv。

我正在编写一个bash脚本来获取这些列中的少数几个。

CSV:

0.132.XXXXX.1456836300,1456836300,1456814505,900,XXXXXX,762,0.1,3699244,363811201,3025019,482119186,3699204,363808801,3025019,482119186,0,0,0,0,3699153,194638692,3025031,301505084,886378,109026314,2812835,33759500,2138713,85552320,3025031,301505084,3699096,363753480,3699096,363753480,3699096,434036304,3699153,194638692,3699153,283418364,0,0,0,0,0,0,0,0,4291150,4970942734,4286035,4817376889,4291126,4970941294,4286035,4817376889,0,0,4898811554,4286035,4286035,4817376889,4286035,4697533512,4286035,4594668672,0,0,0,0,0,0,4291120,4700737486,4286035,4594668672,4291120,4700737486,3405068,4421499690,3399983,4418549966,4286035,4594668672,4291120,4970939408,0,0,0,0,0
0.132.YYYYYY.1456835400,1456835400,1456813605,900,YYYYYYYY,761,0.1,3642774,359185359,3002739,478806690,3642735,359183019,3002739,478806690,0,0,0,0,3642572,192544856,3002731,299528510,887300,109139720,2755332,33069464,2115491,84623440,3002731,299528510,3642629,359128287,3642629,359128287,3642629,428338238,3642572,192544856,3642572,279966584,0,0,0,0,0,0,0,0,4263398,4930723176,4259146,4779228782,4263375,4930721796,4259146,4779228782,0,0,4860152556,4259146,4259146,4779228782,4259126,4660142239,4259126,4557923215,0,0,0,0,0,0,4263381,4662299857,4259126,4557923215,4263381,4662299857,3376436,4384383822,3372181,4382438954,4259126,4557923215,4263369,4930719910,0,0,0,0,0

我做了一些研究并发现了这个:

while IFS="," read $col1 $col2 ...
do
    echo "$col1|$col2"
done < /home/xxx/Desktop/data.csv 

但它需要把所有列(在我的情况下为92)...我不能选择我想要的。所以我尝试了另一个解决方案:

cat /home/xxx/Desktop/data.csv | while read line
do
        a=[ cut -d',' -f5 $line];    # get the source        
        b=[ cut -d',' -f3 $line];    # get the received time
    echo "$a  .  $b"
done

由于$ line的大小,它无法工作。我得到的错误名称太长或类似的东西。 (并且它看起来并没有真正优化但是我猜我接近它。有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

您只能使用cut

cut -d, -f3,18 --output-delimiter='|' data.csv

请注意,仅当逗号从未在CSV中转义或引用时才有效,并且任何值都不能包含换行符。

要遍历行并填充变量,您可以执行

cut -d, -f3,18 --output-delimiter=' ' data.csv | while read col3 col18 ; do
    echo "$col3 | $col18"
done