Трикове на командния ред за учени с данни

За много учени с данни, манипулирането на данни започва и завършва с Pandas или Tidyverse. На теория в това понятие няма нищо лошо. В крайна сметка, защо тези инструменти съществуват на първо място. И все пак, тези опции често могат да бъдат излишни за прости задачи.

Стремежът към овладяване на командния ред трябва да бъде в списъка на всеки програмист, особено на учените с данни. Научаването на доходите на вашия терминал безспорно ще ви направи по-продуктивни. Отвъд това командният ред служи като страхотен урок по история в изчислителната техника. Например awk - скриптов език, управляван от данни. Awk се появява за първи път през 1977 г. с помощта на Брайън Керниган, K в легендарната книга K&R. Днес, някои близо 50 години по-късно, awk остава актуален с новите книги, които все още се появяват всяка година! По този начин е безопасно да се предположи, че инвестирането в малко съветник от командния ред няма да се обезценява скоро.

Какво ще покрием

  • изброяване
  • ГЛАВА
  • TR
  • тоалетна
  • SPLIT
  • SORT & UNIQ
  • РАЗРЕЗ
  • PASTE
  • ПРИСЪЕДИНИТЕ
  • GREP
  • SED
  • AWK

изброяване

Кодирането на файлове може да бъде сложно. В по-голямата си част файловете в наши дни са кодирани всички UTF-8. За да разберете част от магията зад UTF-8, вижте това отлично видео. Въпреки това, има случаи, когато получаваме файл, който не е в този формат. Това може да доведе до някои опитни опити за подмяна на схемата за кодиране. Ето, iconv е спасител на живота. Iconv е проста програма, която ще вземе текст в едно кодиране и ще изведе текста в друга.

# Преобразуване -f (от) latin1 (ISO-8859-1)
# -t (към) стандарт UTF_8
iconv -f ISO-8859-1 -t UTF-8  output.txt

Полезни опции:

  • iconv - изброявам всички известни кодировки
  • iconv -c безмълвно изхвърля символи, които не могат да бъдат преобразувани

ГЛАВА

Ако сте чест потребител на Pandas, тогава главата ще бъде позната. Често, когато работим с нови данни, първото нещо, което искаме да направим, е да разберем какво съществува. Това води до изстрелване на Pandas, четене в данните и след това извикване на df.head () - най-малкото напрегнато. Head, без знамена, ще разпечата първите 10 реда на файл. Истинската сила на главата се крие в тестване на операции за почистване. Например, ако искахме да променим разделителя на файл от запетаи на тръби. Един бърз тест би бил: head mydata.csv | sed 's /, / | / g'.

# Отпечатва първите 10 реда
head filename.csv
# Отпечатайте първите 3 реда
head -n 3 filename.csv

Полезни опции:

  • head -n отпечатайте определен брой линии
  • head -c отпечатва определен брой байтове

TR

Tr е аналог на превода. Тази мощна помощна програма е работен кон за основно почистване на файлове. Идеалният случай за използване е за размяна на разделителите в рамките на файл.

# Преобразуване на файл с разделители в запетаи
котка tab_delimited.txt | tr "\\ t" ","> запетая_delimited.csv

Друга характеристика на tr са всички вградени променливи [: class:], с които разполагате. Те включват:

[: alnum:] всички букви и цифри
[: alpha:] всички букви
[: blank:] цялото хоризонтално бяло пространство
[: cntrl:] всички контролни знаци
[: цифра:] всички цифри
[: graph:] всички символи за печат, без да включва интервал
[: долни:] всички малки букви
[: print:] всички символи за печат, включително интервал
[: punct:] всички препинателни знаци
[: space:] цялото хоризонтално или вертикално бяло пространство
[: горен:] всички големи букви
[: xdigit:] всички шестнадесетични цифри

Можете да свържете различни от тях заедно, за да съставите мощни програми. По-долу е основна програма за броене на думи, която бихте могли да използвате, за да проверите README за прекомерна употреба.

котка README.md | tr "[: punct:] [: интервал:]" "\ n" | tr "[: горен:]" "[: долен:]" | грепвам | сортиране | uniq -c | сортиране -nr

Друг пример с използване на основен регекс:

# Преобразуване на всички малки букви в малки букви
cat filename.csv | tr '[A-Z]' '[a-z]'

Полезни опции:

  • tr -d изтриване на знаци
  • tr -s стискане на знаци
  • \ b обратно пространство
  • \ f формуляр за емисия
  • \ v вертикален раздел
  • \ NNN символ с октална стойност NNN

тоалетна

Брой думи. Стойността му се извлича предимно от флага -l, който ще ви даде броя на реда.

# Ще върне броя на реда в CSV
wc -l gigantic_comma.csv

Този инструмент е удобен за потвърждаване на изхода на различни команди. Така че, ако преобразуваме разделителите в един файл и след това стартираме wc -l, бихме очаквали общите редове да са същите. Ако не, тогава знаем, че нещо се е объркало.

Полезни опции:

  • wc -c отпечатайте броя на байтовете
  • wc -m отпечатване на знаците
  • wc -L дължина на печат на най-дългата линия
  • wc -w брой отпечатани думи

SPLIT

Размерите на файловете могат да варират драстично. И в зависимост от работата, би било полезно да разделите файла - по този начин да разделите. Основният синтаксис за разделяне е:

# Ще разделим CSV файла си на new_filename на всеки 500 реда
split -l 500 filename.csv new_filename_
# filename.csv
# ls изход
# new_filename_aaa
# new_filename_aab
# new_filename_aac

Две странности са конвенцията за именуване и липсата на разширения на файлове. Конфиксът на суфикса може да бъде цифров чрез флага -d. За да добавите разширения на файлове, ще трябва да изпълните следната команда find. Той ще промени имената на ВСИЧКИ файлове в текущата директория, като добави .csv, така че бъдете внимателни.

намирам . -тип f -exec mv '{}' '{}'. csv \;
# ls изход
# filename.csv.csv
# new_filename_aaa.csv
# new_filename_aab.csv
# new_filename_aac.csv

Полезни опции:

  • split -b split по определен размер на байта
  • split -a генерира наставки с дължина N
  • split -x split с помощта на шестнадесетичен суфикс

SORT & UNIQ

Предходните команди са очевидни: те правят това, което казват, че правят. Тези двама осигуряват най-големия удар в тандем (т.е. уникален брой на думите). Това се дължи на uniq, който работи само на дублиращи се съседни линии. По този начин, причината за сортиране, преди да пропуснете изхода. Една интересна забележка е, че сортирането -u ще постигне същите резултати като типичния файл за сортиране.txt | uniq модел.

Sort има изключително полезна способност за учените с данни: способността да сортират цял ​​CSV въз основа на определена колона.

# Сортиране на CSV файл по втората колона по азбучен ред
сортиране -t, -k2 filename.csv
# Числено
сортиране -t, -k2n filename.csv
# Обратна поръчка
сортиране -t, -k2nr filename.csv

Опцията -t тук е да посочите запетаята като наш разделител. По-често се приемат интервали или раздели. Освен това флагът -k е за уточняване на нашия ключ.

Полезни опции:

  • сортиране -f игнорира случай
  • сортиране -r обратен ред за сортиране
  • сортиране -R поръчка за кодиране
  • uniq -c брои броя на събитията
  • uniq -d отпечатва само дублиращи се линии

РАЗРЕЗ

Cut е за премахване на колони. За илюстрация, ако искахме само първата и третата колона.

cut -d, -f 1,3 filename.csv

За да изберете всяка колона, различна от първата.

cut -d, -f 2- filename.csv

В комбинация с други команди, cut служи като филтър.

# Отпечатайте първите 10 реда от колони 1 и 3, където има „some_string_value“
head filename.csv | grep "some_string_value" | отрязване -d, -f 1,3

Намиране на броя уникални стойности във втората колона.

cat filename.csv | изрязване -d, -f 2 | сортиране | uniq | wc -l
# Пребройте появата на уникални стойности, ограничаващи се до първите 10 резултата
cat filename.csv | изрязване -d, -f 2 | сортиране | uniq -c | глава

PASTE

Paste е ниша команда с интересна функция. Ако имате два файла, които се нуждаете от обединени, и те вече са сортирани, поставете ли сте обхванати.

# имена.txt
Адам
Джон
Зак
# jobs.txt
юрист
Участник в YouTube
разработчик
# Присъединете се към двамата в CSV
поставете -d ',' names.txt jobs.txt> person_data.txt
# Изход
Адам, адвокат
Йоан, участник в YouTube
Зак, разработчик

За повече Sque -que вариант вижте по-долу.

ПРИСЪЕДИНИТЕ

Join е опростен, квази-тангенциален, SQL. Най-големите разлики са, че съединяването връща всички колони и съвпадения може да бъде само в едно поле. По подразбиране join ще се опита да използва първата колона като ключ за съвпадение. За различен резултат е необходим следният синтаксис:

# Присъединете се към първия файл (-1) от втората колона
# и вторият файл (-2) от първия
присъединяване -t, -1 2 -2 1 first_file.txt second_file.txt

Стандартното съединение е вътрешно съединение. Въпреки това, външно съединение също е жизнеспособно чрез флага -a. Друга забележима бележка е флагът -e, който може да се използва за заместване на стойност, ако се намери липсващо поле.

# Външно съединяване, заменете празните места с NULL в колони 1 и 2
# -o кои полета да се замени - 0 е ключ, 1.1 е първа колона и т.н. ...
присъединяване -t, -1 2 -a 1 -a2 -e 'NULL' -o '0,1.1,2.2' first_file.txt second_file.txt

Не най-удобната за потребителя команда, но отчаяни времена, отчаяни мерки.

Полезни опции:

  • присъединяване - печат на нежелани линии
  • join -e заменете липсващите полета за въвеждане
  • присъединяване -j еквивалент на -1 FIELD -2 FIELD

GREP

Глобално търсене на редовен израз и печат, или греп; вероятно, най-добре познатата команда и с основателна причина. Grep има много сила, особено за намиране на обиколки с големи кодови бази. В рамките на науката за данни, тя действа като механизъм за усъвършенстване на други команди. Въпреки че стандартното му използване също е ценно.

# Рекурсивно търсене и изброяване на всички файлове в директория, съдържащи 'word'
grep -lr 'дума'.
# Списък номер на файлове, съдържащи word
grep -lr 'дума'. | wc -l

Пребройте общия брой редове, съдържащи дума / шаблон.

grep -c 'some_value' filename.csv
# Същото нещо, но във всички файлове в текущата директория според името на файла
grep -c 'some_value' *

Греп за множество стойности с помощта на оператора - \ |.

grep "first_value \ | second_value" filename.csv

Полезни опции

  • псевдоним grep = "grep --color = auto" правят грепа цветна
  • grep -E използвайте разширени regexps
  • grep -w съвпадат само с цели думи
  • grep-печат име на файлове със съвпадение
  • grep -v обърнато съвпадение

ГОЛЕМИТЕ ПУСКИ

Sed и Awk са двете най-мощни команди в тази статия. За краткост няма да се впускам в изтощителни подробности за нито едно от двете. Вместо това ще обхвана различни команди, които доказват своята впечатляваща сила. Ако искате да знаете повече, има книга точно за това.

SED

В основата си sed е поток редактор, който работи на ред по ред. Той се отличава с замествания, но може да се използва за цялостно рефакторинг.

Най-основната команда sed се състои от s / old / new / g. Това се превежда за търсене на стара стойност, замяна на всички събития в съответствие с нови. Без / g нашата команда би приключила след първото появяване на реда.

За да получите бърз вкус на мощността, можете да се потопите в пример. В този сценарий ви е предоставен следния файл:

баланс, име
$ 1000, Джон
$ 2000, жак

Първото нещо, което може да искаме да направим, е да премахнем знаците за долар. Флагът -i указва на място. '' Означава да обозначаваме разширение на файла с нулева дължина, като по този начин презаписваме първоначалния си файл. В идеалния случай бихте тествали всеки от тях поотделно и след това ще изведете в нов файл.

sed -i '' 's / \ $ // g' data.txt
# баланс, име
# 1000, джон
# 2000, жак

На следващо място, запетаите в стойностите на колоната ни за баланс.

sed -i '' 's / \ ([0-9] \), \ ([0-9] \) / \ 1 \ 2 / g' data.txt
# баланс, име
# 1000, джон
# 2000, жак

И накрая, Джак стана и реши да прекрати един ден. Така че, au revoir, mon ami.

sed -i '' '/ jack / d' data.txt
# баланс, име
# 1000, джон

Както можете да видите, sed уплътнява доста удар, но забавлението не спира.

AWK

Най-доброто за последно. Awk е много повече от обикновена команда: това е пълен език. От всичко, обхванато в тази статия, awk е далеч най-готиният. Ако се впечатлите, има много големи ресурси - вижте тук, тук и тук.

Честите случаи за използване на awk включват:

  • Обработка на текст
  • Форматирани текстови отчети
  • Извършване на аритметични операции
  • Извършване на стринг операции

Awk може да успоредно грепва в най-зараждащата си форма.

awk '/ word /' filename.csv

Или с малко повече магия комбинацията греп и рязане. Тук awk отпечатва третата и четвъртата колона, разделена на раздели, за всички редове с нашата дума. -F, просто променя нашия разделител на запетая.

awk -F, '/ word / {print $ 3 "\ t" $ 4} "filename.csv

Awk се предлага с много вградени променливи. Например NF - брой полета - и NR - брой записи. За да получите петдесет и третия запис във файл:

awk -F, 'NR == 53' filename.csv

Добавена бръчка е способността да се филтрира въз основа на една или повече стойности. Първият пример по-долу ще отпечата номера на реда и колоните за записи, където първата колона е равна на низ.

awk -F, '$ 1 == "string" {print NR, $ 0}' filename.csv
# Филтриране на базата на числова стойност във втора колона
awk -F, '$ 2 == 1000 {print NR, $ 0}' filename.csv

Множество числови изрази:

# Печат на номера на реда и колоните, където колоната три е по-голяма
# от 2005 г. и колона пет по-малко от хиляда
awk -F, '$ 3> = 2005 && $ 5 <= 1000 {print NR, $ 0}' filename.csv

Обобщете третата колона:

awk -F, '{x + = $ 3} END {print x}' filename.csv

Сумата от третата колона за стойности, при които първата колона е равна на „нещо“.

awk -F, '$ 1 == "нещо" {x + = $ 3} END {print x}' filename.csv

Вземете размерите на файл:

awk -F, 'END {print NF, NR}' filename.csv
# По-красива версия
awk -F, 'BEGIN {print "COLUMNS", "ROWS"}; КРАЙ {print NF, NR} 'filename.csv

Линиите за печат се появяват два пъти:

awk -F, '++ видя [$ 0] == 2' име на файл.csv

Премахване на дублиращи се линии:

# Поредни редове
awk 'a! ~ $ 0; {А = $ 0} ']
# Непоследователни редове
страхотно! a [$ 0] ++ 'filename.csv
# По-ефикасно
awk '! ($ 0 в a) {a [$ 0]; print}

Заменете няколко стойности с помощта на вградена функция gsub ().

awk '{gsub (/ scarlet | рубин | puce /, "червено"); отпечатате} "

Тази команда awk ще комбинира множество CSV файлове, игнорирайки заглавката и след това ще я добави в края.

awk 'FNR == 1 && NR! = 1 {next;} {print}' * .csv> final_file.csv

Трябва да намалите мащабен файл? Welp, awk може да се справи с това с помощта на сед. По-конкретно, тази команда разбива един голям файл на няколко по-малки, въз основа на броя на редовете. Този еднолинейник ще добави и разширение.

sed '1d; $ d' име на файл.csv | awk 'NR% NUMBER_OF_LINES == 1 {x = "име на файла -" ++ i ".csv";} {print> x}'
# Пример: разделяне на big_data.csv на data_ (n) .csv на всеки 100 000 реда
sed '1d; $ d' big_data.csv | awk 'NR% 100000 == 1 {x = "данни _" ++ i ".csv";} {print> x}'

ЗАТВАРЯНЕ

Командният ред може да се похвали с безкрайна сила. Командите, обхванати в тази статия, са достатъчни, за да ви издигнат от нула до герой за нула време. Отвъд обхванатите, има много помощни програми, които трябва да се вземат предвид при ежедневните операции с данни. Csvkit, xsv и q са три бележки. Ако искате да се потопите още по-дълбоко в науката за данни за командния ред, тогава не поглеждайте повече от тази книга. Той е достъпен и онлайн безплатно!

Повече в моя блог!

ВРЪЗКИ

  • Sed One-Liners
  • Awk еднолинейни
  • Работа с CSV файлове в командния ред
  • Прикачени файлови разширения
  • Моите най-добри трикове за AWK
  • Биоинформатика еднолинейни
  • УНИКС училище
  • Sed - Въведение и урок