Se eu tiver um arquivo csv, há uma maneira rápida do bash para imprimir o conteúdo de apenas uma coluna? É seguro presumir que cada linha tem o mesmo número de colunas, mas o conteúdo de cada coluna teria um comprimento diferente.
111
echo '1,"2,3,4,5",6' | awk -F "\"*,\"*" '{print $2}'
irá imprimir em2
vez de2,3,4,5
.gawk -F"|" "{print $13}" files*.csv
...,"string,string",...
"
e a última terminará com"
awk -F "\"*;\"*" '{print $2}' textfile.csv
sim.
cat mycsv.csv | cut -d ',' -f3
imprimirá a 3ª coluna.fonte
awk
A maneira mais simples de fazer isso foi usar apenas csvtool . Eu também tive outros casos de uso para usar csvtool e ele pode lidar com as aspas ou delimitadores de forma adequada se eles aparecerem nos próprios dados da coluna.
Substituir 2 pelo número da coluna extrairá efetivamente os dados da coluna que você está procurando.
fonte
cat input.csv | csvtool formath '%(2)\n' -
Nota Eu sei que cat aqui é inútil, mas submeta-o para qualquer comando que normalmente exportaria um csv.format '%(2)\n'
comando não poderia dizer onde termina um campo. (csvtool 1.4.2)csvtool
parecem exigir o uso-
como nome de arquivo de entrada para ler stdin.csvtool format '%(1),%(10)\n' - < in.csv > out.csv
Desembarcou aqui procurando extrair de um arquivo separado por tabulações. Pensei em acrescentar.
Onde
-f2
extrai o 2, coluna indexada diferente de zero, ou a segunda coluna.fonte
cat
é desnecessário:< textfile.tsv cut -f2 -s
Muitas respostas para essas perguntas são ótimas e algumas até examinaram os casos de canto. Eu gostaria de adicionar uma resposta simples que pode ser de uso diário ... onde você geralmente entra nesses casos extremos (como vírgulas de escape ou vírgulas entre aspas etc.).
Então, usando BEGIN (Executar antes de inserir), podemos definir este campo para qualquer coisa que quisermos ...
O código acima imprimirá a 3ª coluna em um arquivo csv.
fonte
As outras respostas funcionam bem, mas como você pediu uma solução usando apenas o shell bash, você pode fazer o seguinte:
E então você pode retirar colunas (a primeira neste exemplo) assim:
Portanto, há algumas coisas acontecendo aqui:
while IFS=,
- significa usar uma vírgula como IFS (Separador de campo interno), que é o que o shell usa para saber o que separa os campos (blocos de texto). Portanto, dizer IFS = é como dizer "a, b" é o mesmo que "a b" seria se IFS = "" (que é o que é por padrão).read -a csv_line;
- isso quer dizer leia em cada linha, um de cada vez e crie um array onde cada elemento é chamado de "csv_line" e envie para a seção "do" de nosso loop whiledo echo "${csv_line[0]}";done < file
- agora estamos na fase "do", e estamos dizendo echo o 0º elemento do array "csv_line". Esta ação é repetida em todas as linhas do arquivo. A< file
parte é apenas dizer ao loop while de onde ler. NOTA: lembre-se, em bash, os arrays são indexados em 0, então a primeira coluna é o 0º elemento.Então aí está, puxando uma coluna de um CSV no shell. As outras soluções são provavelmente mais práticas, mas esta é pura bash.
fonte
Você pode usar o GNU Awk, consulte este artigo do guia do usuário . Como uma melhoria para a solução apresentada no artigo (em junho de 2015), o seguinte comando gawk permite aspas duplas dentro de campos com aspas duplas; uma aspa dupla é marcada por duas aspas duplas consecutivas (""). Além disso, isso permite campos vazios, mas mesmo isso não pode lidar com campos de várias linhas . O exemplo a seguir imprime a 3ª coluna (via
c=3
) de textfile.csv:Observe o uso de
dos2unix
para converter possíveis quebras de linha de estilo DOS (CRLF ou seja, "\ r \ n") e codificação UTF-16 (com marca de ordem de byte) para "\ n" e UTF-8 (sem marca de ordem de byte), respectivamente. Arquivos CSV padrão usam CRLF como quebra de linha, consulte Wikipedia .Se a entrada pode conter campos de várias linhas, você pode usar o seguinte script. Observe o uso de string especial para separar registros na saída (uma vez que a nova linha do separador padrão pode ocorrer dentro de um registro). Novamente, o exemplo a seguir imprime a 3ª coluna (via
c=3
) de textfile.csv:Existe outra abordagem para o problema. O csvquote pode gerar o conteúdo de um arquivo CSV modificado para que os caracteres especiais dentro do campo sejam transformados de forma que as ferramentas usuais de processamento de texto do Unix possam ser usadas para selecionar certas colunas. Por exemplo, o código a seguir gera a terceira coluna:
csvquote
pode ser usado para processar arquivos grandes arbitrários.fonte
Aqui está um exemplo de arquivo csv com 2 colunas
Para obter a primeira coluna, use:
f representa campo ed representa delimitador
Executar o comando acima produzirá a seguinte saída.
Resultado
Para obter apenas a 2ª coluna:
E aqui está a saída de saída
Outro caso de uso:
Seu arquivo de entrada csv contém 10 colunas e você deseja as colunas 2 a 5 e 8, usando a vírgula como separador ".
cut usa -f (que significa "campos") para especificar colunas e -d (que significa "delimitador") para especificar o separador. Você precisa especificar o último porque alguns arquivos podem usar espaços, tabulações ou dois-pontos para separar colunas.
cut é um utilitário de comando e aqui estão mais alguns exemplos:
fonte
Eu precisava de análise CSV adequada, não
cut
/awk
e oração. Estou tentando isso em um mac semcsvtool
, mas os macs vêm com ruby, então você pode fazer:fonte
Primeiro, criaremos um CSV básico
Então temos a 1ª coluna
fonte
onde 2 é a coluna na qual você está interessado
você também pode fazer
para fazer várias colunas
fonte
Acho que o mais fácil é usar o csvkit :
Obtém a 2ª coluna:
csvcut -c 2 file.csv
No entanto, também existe o csvtool e provavelmente várias outras ferramentas csv bash por aí:
sudo apt-get install csvtool
(para sistemas baseados em Debian)Isso retornaria uma coluna com a primeira linha contendo 'ID'.
csvtool namedcol ID csv_file.csv
Isso retornaria a quarta linha:
csvtool col 4 csv_file.csv
Se você quiser descartar a linha do cabeçalho:
csvtool col 4 csv_file.csv | sed '1d'
fonte
Eu me pergunto por que nenhuma das respostas até agora mencionou csvkit.
documentação csvkit
Eu o utilizo exclusivamente para gerenciamento de dados csv e até agora não encontrei nenhum problema que não pudesse resolver com o cvskit.
Para extrair uma ou mais colunas de um arquivo cvs, você pode usar o
csvcut
utilitário que faz parte da caixa de ferramentas. Para extrair a segunda coluna, use este comando:página de referência do csvcut
Se as strings no csv estiverem entre aspas, adicione o caractere de aspas com a
q
opção:Instale com
pip install csvkit
ousudo apt install csvkit
.fonte
Você não pode fazer isso sem um analisador CSV completo.
fonte
cut
?Estou usando esse código há algum tempo, ele não é "rápido" a menos que você conte "cortar e colar do stackoverflow".
Ele usa os operadores $ {##} e $ {%%} em um loop em vez de IFS. Ele chama 'err' e 'morrer', e suporta apenas vírgula, traço e tubo como caracteres SEP (isso é tudo que eu precisava).
Exemplo:
fonte
Você também pode usar o loop while
fonte