Se você tiver colunas simples separadas por vírgula, poderá fazê-lo com o awk. Analise a primeira linha para determinar as colunas desejadas e, em seguida, imprima essas colunas.
wanted_columns=city,zip
wanted_columns=",$wanted_columns," awk -F, '
NR==1 {
for (i=1; i<=NF; i++) {
if (index(ENVIRON["wanted_columns"], ","$i",")) {last=i; columns[i]=","}
columns[last]="\n"
}
}
{
for (i=1; i<=NF; i++) {
if (columns[i]) printf "%s%s", $i, columns[i]
}
}'
Como alternativa, você pode usar cut
; isso será mais rápido se o arquivo for grande. Primeiro, analise a linha de cabeçalho com diferentes ferramentas para determinar os números das colunas.
wanted_columns=city,zip
{
IFS= read header;
cut_spec=$(printf %s "$header" |
wanted_columns=",$wanted_columns," awk -v RS=, '
index(ENVIRON["wanted_columns"], ","$0",") {printf "%d,", NR}'
);
{ printf %s\n "$header"; cat; } | cut -d , -f "${cut_spec%,}";
}
Se o seu arquivo CSV for um arquivo CSV real com algumas colunas citadas que podem ter colunas incorporadas ou novas linhas, use uma ferramenta CSV adequada. Por exemplo, em Python :
#!/usr/bin/env python2
import csv, sys
wanted_columns = set(sys.argv[1:])
reader = csv.reader(sys.stdin)
header = reader.next()
columns = [i for i in range(len(header)) if header[i] in wanted_columns]
writer=csv.writer(sys.stdout)
writer.writerow(sys.argv[1:])
for row in reader: writer.writerow([row[i] for i in columns])
(Passe os nomes das colunas desejadas como argumentos para o script.)