Мы сгенерируем CSV-файл со значениями ниже
yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9
Мне нужно извлечь данные и создать файлы на основе второго столбца. Если это 577, то вся строка должна быть извлечена и помещена в отдельный файл. Я имею в виду, что мне нужен файл со строками со вторым столбцом только 577 и другой файл со вторым столбцом 132
Я пытался использовать IF, но не работал
Ответы:
Используйте
awk
:Это создаст два файла
577.csv
и132.csv
в вашем текущем каталоге.Команда выше предполагает, что вы можете иметь только
132
или577
как второе поле. Это создаст одно имя файла для каждого из значений, найденных во втором поле целогоfile.csv
.Если есть другие значения помимо двух, которые вас интересуют, и вы хотите игнорировать эти строки, сделайте это вместо:
источник
awk
реализации, которые нельзя использоватьprint > $2 ".cvs"
. На тех, вы должны сначала вычислить имя файла, а затем выполнитеprint
:fname = $2 ".cvs"; print > fname
.Мне нравится
awk
решение Тердона , но для полноты, вот предложение, использующее толькоbash
Он будет производить файлы
577.csv
и132.csv
в текущем каталоге.источник
Извлечь все 577 в стандартный вывод
- отредактируйте 1 Исправлено на основе комментария @ terdon ниже, чтобы избежать ложных совпадений, когда по крайней мере 3 запятых на линии с 577.
Но я думаю, что его / ее
awk
решение является более полным.источник
foo577bar
илиyp9012,132,8,577
..*
они также могут совпадать с запятыми, чтобы вы не знали, какое поле вы подходите. Может быть вторым, также может быть 45-м. Моя вторая жалоба была неправильной, вы правы в том, что запятые защищают от совпаденияfoo577bar
.Использование
csvkit
:Команда
-c 2
makecvsgrep
рассматривает второй столбец, и-m 577
мы просим его сопоставить строку577
в этом столбце.Следующее будет написано
output.csv
:Чтобы сопоставить количество строк и записать вывод в файл для каждой строки:
Это создаст два файла
output-132.csv
иoutput-577.csv
.источник