Витягніть дані з файлу та розмістіть у різних файлах на основі одного значення стовпця


14

Ми створимо файл csv із значеннями нижче

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

Мені потрібно витягнути дані та створити файли на основі другого стовпця. Якщо це 577, то весь рядок потрібно витягнути і помістити в окремий файл. Я маю на увазі, що мені потрібен файл із рядками з другим стовпцем як 577, а інший файл із другим стовпцем як 132

Я спробував використовувати IF, але не вийшло


5
Насправді розміщення коду, який не працює, завжди є хорошою ідеєю.
goldilocks

Відповіді:


27

Використання awk:

awk -F, '{ print > $2 ".csv" }' file.csv

Це створить два файли 577.csvі 132.csvу вашому поточному каталозі.

Команда вище , передбачає , що ви можете мати 132або 577як друге поле. Це створить одне ім’я файлу для кожного зі значень, знайдених у другому полі цілого file.csv.

Якщо крім двох, які вас цікавлять, є інші значення, і ви хочете ігнорувати ці рядки, зробіть це замість цього:

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv

1
Існують помилки, awkякі не можна використовувати print > $2 ".cvs". На тих, ви повинні спочатку обчислити ім'я файлу, а потім виконайте print: fname = $2 ".cvs"; print > fname.
Kusalananda

3

Мені подобається awkрішення тердона , але заради повноти тут є лише пропозиція, що використовуєтьсяbash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

Він створить файли 577.csvі 132.csvв поточному каталозі.


3

Витягнути всі 577 в stdout

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv

- відредагуйте 1 Виправлено, грунтуючись на коментарі @ terdon нижче, щоб уникнути помилкових збігів, коли принаймні 3 коми ставлять у відповідність із 577.

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv

Але я думаю, що його / її awkрішення є більш комплексним.


Це буде відповідати, навіть якщо 577 знаходиться на іншому полі, а не на другому або якщо воно є частиною поля. Наприклад foo577barабо yp9012,132,8,577.
тердон

Я думав, що мої коси зроблять це залежним від позиції поля?
X Тянь

Вибачте, я подав погані приклади, але також .*можна відповідати комам, щоб ви не знали, яке поле ви співпадаєте. Може бути другим, може бути і 45-м. Моя друга скарга була помилковою, ви праві, що коми захищають від відповідності foo577bar.
terdon

що робити, якщо | символ використовується замість,.
user3116123

отримання нижче помилки grep: незаконний варіант - e Використання: grep -hblcnsviw файл шаблону. . .
user3116123

1

Використання csvkit:

$ csvgrep -c 2 -m 577 data.csv >output.csv

В -c 2марці cvsgrepрозгляне другу колонку, і -m 577ми просимо , щоб відповідати рядку 577в цьому стовпці.

Буде написано наступне output.csv:

yp1234,577,1,3
yp5678,577,3,5

Щоб відповідати ряду рядків і записати вихід у файл для кожного рядка:

for pattern in 577 132; do
  csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done

Це створить два файли output-132.csvі output-577.csv.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.