Intereting Posts
Как установить FTP-сервер на Red Hat VM? Инвертировать цвет конкретного окна на linux mint Создайте тот же PNG с ImageMagick 2 раза: бинарные файлы отличаются i3wm: как отключить переключение окон при использовании функции тап-клик? grub2 lvm2 raid1 / boot Как я могу заставить mutt автоматически выбирать pgp-ключи? проблема в зеркалировании трафика интерфейсов с использованием OVS Что такое значок запуска в разделе на дисковой утилите gnome? Замените строку в файле на другую, где оба сохраняются в переменных Выполняется непосредственно через TTY более безопасно, чем через эмулятор терминала? Что имеет более высокую производительность? Собственность Nvidia или Nouveau с открытым исходным кодом? контролировать процесс, сопоставляя полный cmdline Подключитесь к серийному, выпустите команду, прочитайте результат, запишите его и выйдите Терминальный эмулятор для CygWin? Linux; запускать сценарий, когда конкретный хост становится доступным (входит в систему в AP)

Извлечение данных из файла и размещение в разных файлах на основе значения столбца 1

Мы создадим файл csv с нижними значениями

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

Мне нужно извлечь данные и создать файлы на основе второго столбца. Если это 577, тогда вся строка должна быть извлечена и помещена в отдельный файл. Я имею в виду, мне нужен файл, имеющий строки со вторым столбцом, как только 577, а другой файл со вторым столбцом – только 132

Я пытался использовать IF, но не работал

Использовать 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 

Мне нравится решение awk terdon, но для полноты, вот предложение, использующее только bash

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

Он будет создавать файлы 577.csv и 132.csv в текущем каталоге.

Чтобы извлечь все 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 более полно.

Использование csvkit :

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

-c 2 делает cvsgrep рассмотрением второго столбца, а с -m 577 мы просим его сопоставить строку 577 в этом столбце.

На output.csv будут записаны следующие 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 .

grep -i "577" inputfile.csv> outputfilewith577.csv
grep -i "138" inputfile.csv> outputfilewith138.csv

Надеюсь, поможет!