4

Я имею дело с файлом CSV, который содержит более 2 миллионов строк. Довольно большой.

Мне нужно использовать grep (или любой другой лучший способ), чтобы получить всю строку, если значение второго столбца соответствует 'jpn' или 'por'.

Я пытался использовать grep '<\jpn\>' || grep '<\por\>' file1.csv > file2.csv но пока безуспешно. Основная проблема в том, что por - это обычное явление в третьем столбце, которое генерирует более миллиона нежелательных строк.

Будет ли более опытный пользователь любезен и поможет?

Заранее спасибо! :D

4 ответа4

11

На какой ОС Linux вы работаете? Попробуйте использовать egrep если вы хотите использовать регулярные выражения в системах с устаревшей версией grep (например, Solaris).

Во всяком случае, вот решение awk:

awk -F, '$2 ~ /jpn|por/ {print}' file1.csv > file2.csv

Пояснения:

  • awk для операций на основе столбцов
  • -F, чтобы определить разделитель столбцов / токенизатор, в этом случае я использую запятую
  • $2 ~ /jpn|por/ тестирует столбец # 2 с выражением /jpn|por/
    • $2 - это столбец № 2
    • /jpn|por/ - это регулярное выражение для соответствия jpn или por
  • { print } указывает, что должен выводить awk, если обнаружил совпадающую строку
    • print чтобы напечатать всю строку ввода (в качестве альтернативы, print $3 будет просто напечатать столбец № 3)
  • ... file1.csv указывает на чтение из входного файла вместо стандартного ввода
1

grep '; jpn;\|; por;' /path/to/file1.csv > file2.csv

Предполагая, что точка с запятой (;) является разделителем.

0

Я не уверен, но, возможно, это может сработать:

grep '^[^,]*,\(por\|jpn\)\(,\|$\)' file1.csv > file2.csv

Предполагая, что "," является разделителем.

0

Кажется, это работает для меня:

egrep '^.?,(jpn|por),.*$' file1.csv > file2.csv

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .