
Na maioria das vezes, no trabalho de um cientista de dados, tenho que transferir dados de uma visão para outra, agregar, levar à mesma granularidade e limpar os dados, carregar, descarregar, analisar, formatar e enviar os resultados (que, em geral, também são dados de alguma forma). Sempre há algo errado com os dados e eles precisam ser movidos rapidamente para frente e para trás - acima de tudo, utilitários Unix clássicos e ferramentas pequenas, mas orgulhosas, me ajudam com isso: vamos falar sobre eles hoje.
E hoje haverá uma seleção com exemplos e situações nas quais devo utilizá-los. Tudo o que é descrito aqui e abaixo é uma experiência subjetiva real e é claro que é diferente para cada pessoa, mas talvez seja útil para alguém.
Ferramentas - aprenda as ferramentas - tudo que é escrito é subjetivo e baseado unicamente na experiência pessoal: isso me ajudou, talvez vá ajudar você.
Antes de começar a ler, lembramos que agora estamos jogando nosso jogo pelos kulkhackers , no qual você terá tempo para ganhar dinheiro ...
Zsh e oh-meu-zsh - depois de todos esses anos em Bash!
Pelo que me lembro agora, eu tinha 17 anos e instalei o Linux. Terminal e Bash. E, de alguma forma, a festa sempre fez parte do processo e personificou para mim o trabalho real no terminal. 12 anos depois do meu doutorado, acabei numa empresa onde havia um documento introdutório e pela primeira vez me deparei com uma papoula e decidi segui-la.
E vejam só! Navegação conveniente por pastas, preenchimento automático humano, indicador git, temas, plug-ins, suporte para um ambiente virtual para python, etc. - agora estou sentado no terminal e não estou muito feliz!

Colocamos zsh, como você normalmente coloca tudo e vai para oh-my-zsh (na verdade, esta é uma montagem folk de receitas que funcionam fora da caixa e adicionamos suporte para plug-ins, temas, etc.). Você pode pegar aqui . E você também pode colocar um tema (bem, por exemplo). Aqui está uma boa demonstração das possibilidades. Retirado deste artigo aqui.
Pipelines

Um dos melhores projetos de terminal é o duto. Em termos simples, ele permite que você conecte as saídas de um comando às entradas de outro, um exemplo de aplicativo simples que foi literalmente retirado de uma tarefa que eu estava realizando há dois dias.
Era necessário simular um problema em um idioma para resolver problemas combinatórios, tudo era iniciado a partir do terminal e exibido de forma absolutamente ilegível a partir do texto, colocando um ícone simples | - entradas, saídas conectadas e suporte de formatação feito:
| python.py format.py
Uma tarefa mais interessante e cotidiana é avaliar algum parâmetro ou característica com base nos dados enviados, como regra, esta é uma série de verificações rápidas de que os valores necessários em algum lugar do servidor com os dados se comportam bem - por exemplo, queremos entender o que temos com o analisador e veja quantos grupos únicos são coletados em todos os arquivos json - este parâmetro deve crescer naturalmente de forma adequada ao longo do tempo:
cat data/*groups* | jq .group | uniq | wc -l
Falaremos mais sobre cada um deles, mas a ideia geral já está clara:
- cat - (abreviação de concatenar) imprime o conteúdo dos arquivos com a palavra "grupo" no nome dos dados / pasta
- jq - remove o campo "grupo" de json
- uniq - deixa apenas grupos únicos
- wc - com a opção -l conta as linhas, ou seja, o número de grupos
E agora vamos dar uma olhada mais de perto no wc.
WC é um utilitário pequeno, mas orgulhoso, para contar linhas, palavras e muito mais.
wc - pode ler rapidamente palavras, linhas, letras, bytes e o comprimento máximo da linha, tudo usando teclas simples:
—bytes
—chars
—words
—lines
—max-line-length
Parece que isso é trivial, mas acaba sendo extremamente frequentemente necessário e conveniente.
Para uso diário, vamos estimar rapidamente quantos dados coletamos (aqui está uma linha, um registro):

Mais detalhes aqui .
Ack / grep
Milhares de manuais e artigos foram escritos sobre eles, mas não posso deixar de mencionar - eles rasgam o texto com regulares e sua própria linguagem de consulta de acordo com o padrão. Em geral, parece-me que ack é mais amigável e fácil de usar fora da caixa, por isso estará aqui:
Exemplo: encontre rapidamente a ocorrência da palavra (chave “-w”) ga2m (tipo de modelo), sem distinção entre maiúsculas e minúsculas (chave -i) em arquivos de origem python :

JQ - analisa json na linha de comando
Documentação .
JQ é totalmente grep / ack para json (embora com um toque de sed e awk - sobre o último mais tarde) - na verdade, um analisador simples para linhas json e json na linha de comando, mas às vezes é extremamente conveniente - de alguma forma, tive que analisar o arquivo wikidata no formato bz2, pesa cerca de 100 GB e cerca de 0,5 TB não compactado.
Dele foi necessário arrancar a correspondência entre vários campos, o que acabou sendo feito de forma muito simples em uma máquina praticamente sem carga de CPU e memória, aqui está o próprio comando que usei:
bzcat data/latest-all.json.bz2 | jq —stream 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' | python3 scripts/post_process.py "output.csv"
Foi essencialmente todo o pipeline que criou o mapeamento necessário, como vemos que tudo funcionou no modo de fluxo:
- bzcat leu parte do arquivo e deu jq
- jq com a chave -stream imediatamente produziu o resultado e o passou para o pós-processador (assim como no primeiro exemplo) em python
- internamente, um pós-processador é uma máquina de estado simples
No total, um pipeline complexo trabalhando em modo de fluxo em big data (0,5 TB), sem recursos significativos e composto de um pipeline simples e algumas ferramentas. Definitivamente recomendo o check-out no seu lazer.
fzf - localizador fuzzy
A coisa mais conveniente (especialmente dentro de um wim): pesquisa rapidamente em arquivos, o que é conveniente para um grande projeto - especialmente quando você tem vários deles. Como regra, você precisa pesquisar arquivos rapidamente por uma determinada palavra em um grande projeto: eu estava imerso em um novo projeto, que inclui vários grandes repositórios e como uma tarefa introdutória, eu precisava adicionar um modelo simples ao sortimento disponível no sistema e precisava rapidamente encontre seus arquivos usando a palavra-chave ga2m e trabalhe por analogia com outros "blocos de código" - edite rapidamente um ou outro - aqui o fzf vem ao resgate muito bem:

Link para o repositório .
AWK
O nome vem das primeiras letras dos criadores Aho, Weinberger e Kernighan: na verdade, uma linguagem de script para processar dados de tabela de texto - ela aplica padrões de transformação a cada linha do arquivo. Como
regra, é ideal para transformações únicas rápidas, por exemplo, tínhamos um conjunto de dados montado manualmente na forma de tsv , e o processador recebeu jsonl como entrada e esperava um campo "tema" adicional que não estava no arquivo de origem (necessário para algumas coisas que não eram críticas para os cálculos atuais) - no total, uma linha simples foi escrita:
cat groups.tsv | awk '{ printf "{\"group\": \"%s\", \"theme\": \"manual\" }\n", $1 }' > group.jsonl
Na verdade, ele pegou um arquivo e envolveu cada linha em json com os campos necessários.
Link do tutorial .
wget - downloader versátil de linha de comando
Regularmente, scripts e pipelines precisam puxar e baixar algo de algum lugar - e o wget não falha: ele pode baixar, fazer login, proxies, cookies e, além de http (s), pode fazer ftp.
Canivete suíço em download.
HSTR - histórico de comando de pesquisa, com um rosto humano
ommand history: hstr
Regularmente, tenho que pesquisar algo no histórico de comandos:
- "Eu já tinha que fazer isso"
- "Com quais chaves o X começa?"
- “Mas essa peça pode ser reaproveitada”
Portanto, é muito importante para mim ter uma pesquisa boa e conveniente no histórico de comandos, enquanto hstr faz seu trabalho completamente:

Útil, mas não incluído
No final, eu mencionaria útil - mas puxando um artigo separado do tópico - é útil observar:
- Ssh + tmux + vim (neo, plugins, etc)
- Conhecimento básico de ganchos git + git de linha de comando
- Data pipeline construction make/just
- Python virtual environments
- Docker
