我试图获取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"的列号。在数组的标题中。之后使用此数字复制列。
答案 0 :(得分:1)
初步说明:与OP中包含的代码所推断的相反,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)
答案 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] } }'