根据字符串名称过滤CSV文件

时间:2017-01-07 15:36:00

标签: linux bash shell csv awk

我试图获取csv文件的特定列(Header包含" SOF"以防万一)。是一个大文件,我需要使用Shell将此列复制到另一个csv文件。

我尝试过这样的事情:

#!/bin/bash
awk ' {
i=1
j=1

while ( NR==1 )
  if ( "$i" ~ /SOF/ )
  then
   array[j] = $i
   $j += 1
  fi
$i += 1

for ( k in array ) 
 print array[k]

}' fil1.csv > result.csv

在这种情况下,我试图保存包含" SOF"的列号。在数组的标题中。之后使用此数字复制列。

4 个答案:

答案 0 :(得分:1)

初步说明:与OP中包含的代码所推断的相反,CSV中的值以分号分隔。

这是一个包含两个单独命令的解决方案:

  • 第一个解析CSV文件的第一行并标识必须导出的字段。我为此使用了awk
  • 第二个只打印字段。我使用cut(语法更简单,比awk更快,特别是如果您的文件很大)

这个想法是第一个命令产生一个字段列表,用“,”分隔,适合作为参数传递给cut

# Command #1: identify fields
fields=$(awk -F";" '
    {
        for (i = 1; i <= NF; i++)
            if ($i ~ /SOF/) {
                fields = fields sep i
                sep = ","
            }
        print fields
        exit
     }' fil1.csv
)

# Command #2: export fields
{ [ -n "$fields" ] && cut -d";" -f "$fields" fil1.csv; } > result.csv

答案 1 :(得分:0)

尝试这样的事情......

$ awk 'BEGIN {FS=OFS=","} 
       NR==1 {for(i=1;i<=NF;i++) if($i~/SOF/) {col=i; break}} 
             {print $col}' file

如果找不到标题,则无法处理,因此应打印整行。

答案 2 :(得分:0)

This link might be helpful for you :

您可能需要的一个有用命令是“剪切”

cut -d,-f 2 input.csv

此处,数字2是您要从csv文件中剪切的列号。

答案 3 :(得分:0)

试试这个:

awk '{for(i=1;i<=NF;i++)a[i]=a[i]" "$i}END{for (i in a ){ print a[i] } }'  filename  | grep SOF | awk '{for(i=1;i<=NF;i++)a[i]=a[i]" "$i}END{for (i in a ){ print a[i] } }'